From: Rob Clark Date: Sat, 18 Nov 2017 15:40:49 +0000 (-0500) Subject: freedreno/ir3: add texture gather support X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ae44845affebede222dce104bf320465d22bd3c6;p=mesa.git freedreno/ir3: add texture gather support Signed-off-by: Rob Clark --- diff --git a/docs/features.txt b/docs/features.txt index 11c40293eba..633d2593738 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -130,7 +130,7 @@ GL 4.0, GLSL 4.00 --- all DONE: i965/gen7+, nvc0, r600, radeonsi GL_ARB_tessellation_shader DONE (i965/gen7+) GL_ARB_texture_buffer_object_rgb32 DONE (freedreno, i965/gen6+, llvmpipe, softpipe, swr) GL_ARB_texture_cube_map_array DONE (i965/gen6+, nv50, llvmpipe, softpipe) - GL_ARB_texture_gather DONE (i965/gen6+, nv50, llvmpipe, softpipe, swr) + GL_ARB_texture_gather DONE (freedreno/a5xx, i965/gen6+, nv50, llvmpipe, softpipe, swr) GL_ARB_texture_query_lod DONE (freedreno, i965, nv50, llvmpipe, softpipe) GL_ARB_transform_feedback2 DONE (i965/gen6+, nv50, llvmpipe, softpipe, swr) GL_ARB_transform_feedback3 DONE (i965/gen7+, llvmpipe, softpipe, swr) diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 62dfd2651c3..e61344fd104 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -263,6 +263,11 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return 4; return 0; + case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: + if (is_a5xx(screen)) + return 4; + return 0; + /* Unsupported features. */ case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: @@ -271,7 +276,6 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_QUERY_PIPELINE_STATISTICS: case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK: case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: - case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: case PIPE_CAP_TEXTURE_GATHER_SM5: case PIPE_CAP_SAMPLE_SHADING: case PIPE_CAP_TEXTURE_GATHER_OFFSETS: diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c index 1e883926386..da4aeaa7acb 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c @@ -2303,9 +2303,20 @@ emit_tex(struct ir3_context *ctx, nir_tex_instr *tex) case nir_texop_txd: opc = OPC_SAMGQ; break; case nir_texop_txf: opc = OPC_ISAML; break; case nir_texop_lod: opc = OPC_GETLOD; break; + case nir_texop_tg4: + /* NOTE: a4xx might need to emulate gather w/ txf (this is + * what blob does, seems gather is broken?), and a3xx did + * not support it (but probably could also emulate). + */ + switch (tex->component) { + case 0: opc = OPC_GATHER4R; break; + case 1: opc = OPC_GATHER4G; break; + case 2: opc = OPC_GATHER4B; break; + case 3: opc = OPC_GATHER4A; break; + } + break; case nir_texop_txf_ms: case nir_texop_txs: - case nir_texop_tg4: case nir_texop_query_levels: case nir_texop_texture_samples: case nir_texop_samples_identical: