Is this feasible? What kind of penalty should I be expecting for such an approach (with a conditional in the frag shader) versus the hardware supporting it natively?
Depends. If you do:
float4 val0 = texture( tex0, uv );
float4 val1 = texture( tex1, uv );
finalVal = uv.y > 0.5 ? val1 : val0;
There is no branch, and the cost is only slightly less performance, and higher power consumption (since you're consuming twice the bandwidth).
But if you do:
vec2 uvDdx = ddx( uv );
vec2 uvDdy = ddy( uv );
if( uv.y )
val = texture( tex0, uv, uvDdx, uvDdy );
else
val = texture( tex1, uv, uvDdx, uvDdy );
Then the performance impact could be quite serious (the cards you're targeting are very bad at hiding latency) but the power consumption should stay in check.
It boils down to whether the performance decrease you get puts you below the minimum you are targeting and decide to consume more power instead.
I've also had problems with devices not supporting frame buffers > 2048 for scrolling textures, but that's a whole other problem lol. Does make you wonder how the GPU guys decide what the limits should be... It must be intriguing what goes into GPU design, although I'm sure all top secret lol.
Smaller resolutions means less bits in the texture unit to perform addressing and filtering. Less bits means less transistors; which translates to lower costs, less power consumption therefore less heat and increased battery life.