gallium: add texture gather support to gallium (v3)
authorDave Airlie <airlied@redhat.com>
Sat, 21 Sep 2013 08:45:43 +0000 (18:45 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 25 Feb 2014 03:29:17 +0000 (13:29 +1000)
This adds support to gallium for a TG4 instruction,
and two CAPs. The first CAP is required for GL_ARB_texture_gather.

The second CAP is required to expose GL_ARB_gpu_shader5.

However so far we haven't found any hardware that natively
exposes the textureGatherOffsets feature from GL, so just
lower it for now. If hardware appears for this we can add
another CAP to allow TG4 to take 4 offsets.

v2: add component selection src and a cap to say
hw can do it. (st can use to help control
GL_ARB_gpu_shader5/GLSL 4.00). Add docs.

v3: rename to SM5, add docs.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
17 files changed:
src/gallium/auxiliary/tgsi/tgsi_info.c
src/gallium/docs/source/screen.rst
src/gallium/docs/source/tgsi.rst
src/gallium/drivers/freedreno/freedreno_screen.c
src/gallium/drivers/i915/i915_screen.c
src/gallium/drivers/ilo/ilo_screen.c
src/gallium/drivers/llvmpipe/lp_screen.c
src/gallium/drivers/nouveau/nv30/nv30_screen.c
src/gallium/drivers/nouveau/nv50/nv50_screen.c
src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/drivers/softpipe/sp_screen.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_shader_tokens.h

index f99360013446d1b6b818d6ce9b45647424a65e85..565f274a545e8ac1cd54a439dcf72def67c160a3 100644 (file)
@@ -221,6 +221,7 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
    { 1, 3, 1, 0, 0, 0, OTHR, "TXL2", TGSI_OPCODE_TXL2 },
    { 1, 2, 0, 0, 0, 0, COMP, "IMUL_HI", TGSI_OPCODE_IMUL_HI },
    { 1, 2, 0, 0, 0, 0, COMP, "UMUL_HI", TGSI_OPCODE_UMUL_HI },
+   { 1, 3, 1, 0, 0, 0, OTHR, "TG4", TGSI_OPCODE_TG4 },
 };
 
 const struct tgsi_opcode_info *
index bd553f4408622fe62c5762a39b6b3630b5cea707..6b5a195765a0fc2f459d4bf730b856651e46ef02 100644 (file)
@@ -182,6 +182,12 @@ The integer capabilities:
   vertex components output by a single invocation of a geometry shader.
   This is the product of the number of attribute components per vertex and
   the number of output vertices.
+* ``PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS``: Max number of components
+  in format that texture gather can operate on. 1 == RED, ALPHA etc,
+  4 == All formats.
+* ``PIPE_CAP_TEXTURE_GATHER_SM5``: Whether the texture gather
+  hardware implements the SM5 features, component selection,
+  shadow comparison, and run-time offsets.
 
 
 .. _pipe_capf:
index be4257255b3ab9bf7383bcefa2235537a5dc9a82..03c5df846f7a0b627c0fcce5dd3159d50f7f5915 100644 (file)
@@ -986,6 +986,42 @@ XXX doesn't look like most of the opcodes really belong here.
 
   dst.z = texture_depth(unit, lod)
 
+.. opcode:: TG4 - Texture Gather (as per ARB_texture_gather)
+               Gathers the four texels to be used in a bi-linear
+               filtering operation and packs them into a single register.
+               Only works with 2D, 2D array, cubemaps, and cubemaps arrays.
+               For 2D textures, only the addressing modes of the sampler and
+               the top level of any mip pyramid are used. Set W to zero.
+               It behaves like the TEX instruction, but a filtered
+               sample is not generated. The four samples that contribute
+               to filtering are placed into xyzw in clockwise order,
+               starting with the (u,v) texture coordinate delta at the
+               following locations (-, +), (+, +), (+, -), (-, -), where
+               the magnitude of the deltas are half a texel.
+
+               PIPE_CAP_TEXTURE_SM5 enhances this instruction to support
+               shadow per-sample depth compares, single component selection,
+               and a non-constant offset. It doesn't allow support for the
+               GL independent offset to get i0,j0. This would require another
+               CAP is hw can do it natively. For now we lower that before
+               TGSI.
+
+.. math::
+
+   coord = src0
+
+   component = src1
+
+   dst = texture_gather4 (unit, coord, component)
+
+(with SM5 - cube array shadow)
+
+   coord = src0
+   
+   compare = src1
+
+   dst = texture_gather (uint, coord, compare)
+
 
 Integer ISA
 ^^^^^^^^^^^^^^^^^^^^^^^^
index e1b5daef39f67d92d9cfa13246a1411940598f76..c53300f406f148a2754ad27211b903247299bcaa 100644 (file)
@@ -203,6 +203,8 @@ 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:
+       case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+       case PIPE_CAP_TEXTURE_GATHER_SM5:
                return 0;
 
        /* Stream output. */
index 9f08f86288833a8e44e29d963df5b3e6838f9d93..c5d2888ea7857e42e8975910887d95af2b8b6646 100644 (file)
@@ -216,6 +216,8 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
    case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
    case PIPE_CAP_TGSI_TEXCOORD:
    case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
 
    case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
index 9c363acb4f77fd9391f5aae16a205ba2f0768a06..255166431acc9aac69aa020d9207fac2696a22bd 100644 (file)
@@ -433,6 +433,8 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
       return true;
    case PIPE_CAP_TGSI_VS_LAYER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
 
    default:
index 43142e7fb55a4f1103b016160be8d8a3b3195b57..4ab19497ca1963226e72fae4f5185001c78e31a6 100644 (file)
@@ -235,6 +235,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_ENDIANNESS:
       return PIPE_ENDIAN_NATIVE;
    case PIPE_CAP_TGSI_VS_LAYER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
    }
    /* should only get here on unhandled cases */
index 9854708b371ac0cd8afbee4f69aaa9da4ec3bb85..8862a5d5e61a9fa26b35e8fc597e4615638d22ee 100644 (file)
@@ -128,6 +128,8 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
    case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
    case PIPE_CAP_TGSI_VS_LAYER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
    case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
    case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
index 781b39158b457bdda2e3de417c547ef1e74dbb88..c683cf190b46e15aea915ceca8d6ff9825fb9c9e 100644 (file)
@@ -196,6 +196,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_ENDIANNESS:
       return PIPE_ENDIAN_LITTLE;
    case PIPE_CAP_TGSI_VS_LAYER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
    case PIPE_CAP_MAX_VIEWPORTS:
       return NV50_MAX_VIEWPORTS;
index f04771de452ebbd16702ec4167dbf1b5243be8ac..a07cacdfbf87dd39fcf62f2a7fecf274b92991f6 100644 (file)
@@ -174,6 +174,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_ENDIANNESS:
       return PIPE_ENDIAN_LITTLE;
    case PIPE_CAP_TGSI_VS_LAYER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
    case PIPE_CAP_MAX_VIEWPORTS:
       return 1;
index fcb01e80864dced7a0ddc45b4da0b5d902b6016d..26d73e47ccdde735e1a0f60c6d53c80401e73ad7 100644 (file)
@@ -166,6 +166,8 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
         case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
         case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
         case PIPE_CAP_TGSI_VS_LAYER:
+        case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+        case PIPE_CAP_TEXTURE_GATHER_SM5:
             return 0;
 
         /* SWTCL-only features. */
index 0f75a53748f12b77920a93f1d8f93948fd770861..630e21d3484b300647a8c0b8f50f22a7e98a8db8 100644 (file)
@@ -399,6 +399,8 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
        case PIPE_CAP_VERTEX_COLOR_CLAMPED:
        case PIPE_CAP_USER_VERTEX_BUFFERS:
+       case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+       case PIPE_CAP_TEXTURE_GATHER_SM5:
                return 0;
 
        /* Stream output. */
index c64621bf223f8e01db8071cc72ccff47f15c5058..c69be584c2f567a5381fd2115aa0f34ac556e041 100644 (file)
@@ -285,6 +285,8 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
        case PIPE_CAP_USER_VERTEX_BUFFERS:
        case PIPE_CAP_CUBE_MAP_ARRAY:
+       case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+       case PIPE_CAP_TEXTURE_GATHER_SM5:
                return 0;
 
        case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
index 46ac519db12ebc0fff4c920d3f61b4d6a36fb469..0eae9ed473c2c3f198762672b18219dac29be3d1 100644 (file)
@@ -185,6 +185,8 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_ENDIANNESS:
       return PIPE_ENDIAN_NATIVE;
    case PIPE_CAP_TGSI_VS_LAYER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
    }
    /* should only get here on unhandled cases */
index d5ae69a70d97f1a59dc8f664dced06da22748d5d..ae2623d09c955412f1366b86eb907589bdc98312 100644 (file)
@@ -266,6 +266,8 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
    case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
    case PIPE_CAP_TGSI_VS_LAYER:
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+   case PIPE_CAP_TEXTURE_GATHER_SM5:
       return 0;
    case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
       return 64;
index 83815cdf2da0d5ff76287ea9c6f46eff077610fd..764c2484f8706e60922812e44d44d36f58bac88b 100644 (file)
@@ -522,7 +522,9 @@ enum pipe_cap {
    PIPE_CAP_MIXED_FRAMEBUFFER_SIZES = 86,
    PIPE_CAP_TGSI_VS_LAYER = 87,
    PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES = 88,
-   PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 89
+   PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 89,
+   PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS = 90,
+   PIPE_CAP_TEXTURE_GATHER_SM5 = 91
 };
 
 #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
index 8750bd2da2ee373839742c09d74c04b0bc270bbd..8fa6a0afaeb22fd96951698c0b7689dc8943d804 100644 (file)
@@ -453,7 +453,9 @@ struct tgsi_property_data {
 #define TGSI_OPCODE_IMUL_HI             180
 #define TGSI_OPCODE_UMUL_HI             181
 
-#define TGSI_OPCODE_LAST                182
+#define TGSI_OPCODE_TG4                 182
+
+#define TGSI_OPCODE_LAST                183
 
 #define TGSI_SAT_NONE            0  /* do not saturate */
 #define TGSI_SAT_ZERO_ONE        1  /* clamp to [0,1] */