gallium: add a a new cap for changing the TGSI TG4 instruction encoding
authorDave Airlie <airlied@redhat.com>
Wed, 9 Oct 2019 03:07:04 +0000 (13:07 +1000)
committerDave Airlie <airlied@linux.ie>
Fri, 11 Oct 2019 00:32:15 +0000 (00:32 +0000)
Accessing the TG4 component via immediates in the llvmpipe backend is quite
messy (like really messy). Roland suggested we change the instruction encoding,
so introduce a cap to allow the component to be selected to be store in the
sampler swizzle, which should be otherwise unused.

I could probably switch all drivers over, but virgl would need some work that
I'd prefer not to rush it.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/util/u_screen.c
src/gallium/docs/source/screen.rst
src/gallium/docs/source/tgsi.rst
src/gallium/include/pipe/p_defines.h

index ba99ec0615dad5f5998b406dcedbae4f012cf64a..bf5b9daad7ed4daf37eae515724daeeed3d63ec8 100644 (file)
@@ -341,6 +341,7 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
    case PIPE_CAP_ATOMIC_FLOAT_MINMAX:
    case PIPE_CAP_SHADER_SAMPLES_IDENTICAL:
    case PIPE_CAP_TGSI_ATOMINC_WRAP:
+   case PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE:
       return 0;
 
    case PIPE_CAP_MAX_GS_INVOCATIONS:
index 9acab6fafc5bc69f104167fd29dacfbfe2a32492..1c402b033919c93e1c4204078cc62d90dc70c269 100644 (file)
@@ -558,6 +558,7 @@ The integer capabilities:
 * ``PIPE_CAP_GL_SPIRV``: True if the driver supports ARB_gl_spirv extension.
 * ``PIPE_CAP_GL_SPIRV_VARIABLE_POINTERS``: True if the driver supports Variable Pointers in SPIR-V shaders.
 * ``PIPE_CAP_DEMOTE_TO_HELPER_INVOCATION``: True if driver supports demote keyword in GLSL programs.
+* ``PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE``: True if driver wants the TG4 component encoded in sampler swizzle rather than as a separate source.
 
 .. _pipe_capf:
 
index d58b23f024b3998d11476b49d03c8175670bac8b..e053e821ecd54abfea2c7f1d4a14e5dbe01870a2 100644 (file)
@@ -962,14 +962,22 @@ XXX doesn't look like most of the opcodes really belong here.
   require another CAP is hw can do it natively. For now we lower that before
   TGSI.
 
+  PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE changes the encoding so that component
+  is stored in the sampler source swizzle x.
+
 .. math::
 
    coord = src0
 
+   (without TGSI_TG4_COMPONENT_IN_SWIZZLE)
    component = src1
 
    dst = texture\_gather4 (unit, coord, component)
 
+   (with TGSI_TG4_COMPONENT_IN_SWIZZLE)
+   dst = texture\_gather4 (unit, coord)
+   component is encoded in sampler swizzle.
+
 (with SM5 - cube array shadow)
 
 .. math::
index 564f37dd1b578312c785b59f45ffc1f1a20d111e..6657271cbf673131c4809d1056c770cdbda1b223 100644 (file)
@@ -903,6 +903,7 @@ enum pipe_cap
    PIPE_CAP_GL_SPIRV,
    PIPE_CAP_GL_SPIRV_VARIABLE_POINTERS,
    PIPE_CAP_DEMOTE_TO_HELPER_INVOCATION,
+   PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE,
 };
 
 /**