summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeha Bhende <bhenden@vmware.com>2017-08-25 05:06:41 -0700
committerBrian Paul <brianp@vmware.com>2018-09-10 13:07:30 -0600
commit252e97ecdf05ad1050823e14e2119fbe0cc266a0 (patch)
tree6271caa30173da4ade3d0a128dec51a4dce4dcf6
parent36c84bcd7709d760fe30151d2c78a8d3c300978a (diff)
svga: Add support for arb_texture_gather
With sm4_1, we can support single channel 2D or CubeMap textures. This patch exercises this feature. Tested with piglit v2: As per Brian's comment Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Charmaine Lee <charmainel@vmware.com>
-rw-r--r--src/gallium/drivers/svga/svga_screen.c4
-rw-r--r--src/gallium/drivers/svga/svga_tgsi_vgpu10.c48
2 files changed, 51 insertions, 1 deletions
diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
index b66b560fcc0..a38e062f776 100644
--- a/src/gallium/drivers/svga/svga_screen.c
+++ b/src/gallium/drivers/svga/svga_screen.c
@@ -349,6 +349,9 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
return sws->have_sm4_1;
+ case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+ return sws->have_sm4_1 ? 1 : 0; /* only single-channel textures */
+
/* Unsupported features */
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
@@ -362,7 +365,6 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
- case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
case PIPE_CAP_TEXTURE_GATHER_SM5:
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
case PIPE_CAP_TEXTURE_QUERY_LOD:
diff --git a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
index fa27edcd7cf..b87ac906584 100644
--- a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
+++ b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
@@ -5294,6 +5294,52 @@ emit_tex(struct svga_shader_emitter_v10 *emit,
return TRUE;
}
+/**
+ * Emit code for TGSI_OPCODE_TG4 (texture lookup for texture gather)
+ */
+static boolean
+emit_tg4(struct svga_shader_emitter_v10 *emit,
+ const struct tgsi_full_instruction *inst)
+{
+ const uint unit = inst->Src[2].Register.Index;
+ unsigned target = inst->Texture.Texture;
+ struct tgsi_full_src_register coord;
+ int offsets[3];
+ struct tex_swizzle_info swz_info;
+
+ /* check that the sampler returns a float */
+ if (!is_valid_tex_instruction(emit, inst))
+ return TRUE;
+
+ if (target == TGSI_TEXTURE_CUBE_ARRAY) {
+ debug_printf("TGSI_TEXTURE_CUBE_ARRAY is not supported\n");
+ return TRUE;
+ }
+
+ begin_tex_swizzle(emit, unit, inst, FALSE, &swz_info);
+
+ get_texel_offsets(emit, inst, offsets);
+
+ coord = setup_texcoord(emit, unit, &inst->Src[0]);
+
+ /* Gather dst, coord, resource, sampler */
+ begin_emit_instruction(emit);
+ emit_sample_opcode(emit, VGPU10_OPCODE_GATHER4,
+ inst->Instruction.Saturate, offsets);
+ emit_dst_register(emit, get_tex_swizzle_dst(&swz_info));
+ emit_src_register(emit, &coord);
+ emit_resource_register(emit, unit);
+ emit_sampler_register(emit, unit);
+ end_emit_instruction(emit);
+
+ end_tex_swizzle(emit, &swz_info);
+
+ free_temp_indexes(emit);
+
+ return TRUE;
+}
+
+
/**
* Emit code for TGSI_OPCODE_TEX2 (texture lookup for shadow cube map arrays)
@@ -5848,6 +5894,8 @@ emit_vgpu10_instruction(struct svga_shader_emitter_v10 *emit,
return emit_issg(emit, inst);
case TGSI_OPCODE_TEX:
return emit_tex(emit, inst);
+ case TGSI_OPCODE_TG4:
+ return emit_tg4(emit, inst);
case TGSI_OPCODE_TEX2:
return emit_tex2(emit, inst);
case TGSI_OPCODE_TXP: