i965: Fix textureSize() depth value for 1 layer surfaces on Gen4-6.
According to the Sandybridge PRM's description of the resinfo message, the .z value returned will be Depth == 0 ? 0 : Depth + 1. The earlier PRMs have the same table. This means we return 0 for array textures with a single slice, when we ought to return 1. Just override it to max(depth, 1). Fixes 10 dEQP-GLES3.functional tests on Sandybridge: shaders.texture_functions.texturesize.sampler2darray_fixed_vertex shaders.texture_functions.texturesize.sampler2darray_fixed_fragment shaders.texture_functions.texturesize.sampler2darray_float_vertex shaders.texture_functions.texturesize.sampler2darray_float_fragment shaders.texture_functions.texturesize.isampler2darray_vertex shaders.texture_functions.texturesize.isampler2darray_fragment shaders.texture_functions.texturesize.usampler2darray_vertex shaders.texture_functions.texturesize.usampler2darray_fragment shaders.texture_functions.texturesize.sampler2darrayshadow_vertex shaders.texture_functions.texturesize.sampler2darrayshadow_fragment Cc: mesa-stable@lists.freedesktop.org Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
08ff5f4d1f
commit
58d4751fa0
|
@ -228,10 +228,16 @@ fs_visitor::emit_texture(ir_texture_opcode op,
|
|||
}
|
||||
|
||||
/* fixup #layers for cube map arrays */
|
||||
if (op == ir_txs && is_cube_array) {
|
||||
if (op == ir_txs && (devinfo->gen < 7 || is_cube_array)) {
|
||||
fs_reg depth = offset(dst, bld, 2);
|
||||
fs_reg fixed_depth = vgrf(glsl_type::int_type);
|
||||
bld.emit(SHADER_OPCODE_INT_QUOTIENT, fixed_depth, depth, brw_imm_d(6));
|
||||
|
||||
if (is_cube_array) {
|
||||
bld.emit(SHADER_OPCODE_INT_QUOTIENT, fixed_depth, depth, brw_imm_d(6));
|
||||
} else if (devinfo->gen < 7) {
|
||||
/* Gen4-6 return 0 instead of 1 for single layer surfaces. */
|
||||
bld.emit_minmax(fixed_depth, depth, brw_imm_d(1), BRW_CONDITIONAL_GE);
|
||||
}
|
||||
|
||||
fs_reg *fixed_payload = ralloc_array(mem_ctx, fs_reg, inst->regs_written);
|
||||
int components = inst->regs_written / (inst->exec_size / 8);
|
||||
|
|
|
@ -1056,10 +1056,16 @@ vec4_visitor::emit_texture(ir_texture_opcode op,
|
|||
/* fixup num layers (z) for cube arrays: hardware returns faces * layers;
|
||||
* spec requires layers.
|
||||
*/
|
||||
if (op == ir_txs && is_cube_array) {
|
||||
emit_math(SHADER_OPCODE_INT_QUOTIENT,
|
||||
writemask(inst->dst, WRITEMASK_Z),
|
||||
src_reg(inst->dst), brw_imm_d(6));
|
||||
if (op == ir_txs) {
|
||||
if (is_cube_array) {
|
||||
emit_math(SHADER_OPCODE_INT_QUOTIENT,
|
||||
writemask(inst->dst, WRITEMASK_Z),
|
||||
src_reg(inst->dst), brw_imm_d(6));
|
||||
} else if (devinfo->gen < 7) {
|
||||
/* Gen4-6 return 0 instead of 1 for single layer surfaces. */
|
||||
emit_minmax(BRW_CONDITIONAL_GE, writemask(inst->dst, WRITEMASK_Z),
|
||||
src_reg(inst->dst), brw_imm_d(1));
|
||||
}
|
||||
}
|
||||
|
||||
if (devinfo->gen == 6 && op == ir_tg4) {
|
||||
|
|
Loading…
Reference in New Issue