gallium/tgsi: Add support for raw resources.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 30 Apr 2012 17:08:55 +0000 (19:08 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 11 May 2012 10:39:41 +0000 (12:39 +0200)
Normal resource access (e.g. the LOAD TGSI opcode) is supposed to
perform a series of conversions to turn the texture data as it's found
in memory into the target data type.

In compute programs it's often the case that we only want to access
the raw bits as they're stored in some buffer object, and any kind of
channel conversion and scaling is harmful or inefficient, especially
in implementations that lack proper hardware support to take care of
it -- in those cases the conversion has to be implemented in software
and it's likely to result in a performance hit even if the pipe_buffer
and declaration data types are set up in a way that would just pass
the data through.

Add a declaration flag that marks a resource as typeless.  No channel
conversion will be performed in that case, and the X coordinate of the
address vector will be interpreted in byte units instead of elements
for obvious reasons.

This is similar to D3D11's ByteAddressBuffer, and will be used to
implement OpenCL's constant arguments.  The remaining four compute
memory spaces can also be understood as raw resources.

src/gallium/auxiliary/tgsi/tgsi_build.c
src/gallium/auxiliary/tgsi/tgsi_dump.c
src/gallium/auxiliary/tgsi/tgsi_text.c
src/gallium/docs/source/tgsi.rst
src/gallium/include/pipe/p_shader_tokens.h

index 1bcdef2e2f25c70814a11b7e1b8d9f8ae11d9067..2945a0d63e7b1ced7c74f454671cd8aebbf8f1c8 100644 (file)
@@ -257,12 +257,14 @@ tgsi_default_declaration_resource(void)
    struct tgsi_declaration_resource dr;
 
    dr.Resource = TGSI_BUFFER;
+   dr.Raw = 0;
 
    return dr;
 }
 
 static struct tgsi_declaration_resource
 tgsi_build_declaration_resource(unsigned texture,
+                                unsigned raw,
                                 struct tgsi_declaration *declaration,
                                 struct tgsi_header *header)
 {
@@ -270,6 +272,7 @@ tgsi_build_declaration_resource(unsigned texture,
 
    dr = tgsi_default_declaration_resource();
    dr.Resource = texture;
+   dr.Raw = raw;
 
    declaration_grow(declaration, header);
 
@@ -439,6 +442,7 @@ tgsi_build_full_declaration(
       size++;
 
       *dr = tgsi_build_declaration_resource(full_decl->Resource.Resource,
+                                            full_decl->Resource.Raw,
                                             declaration,
                                             header);
    }
index 328dfb14f6d744fe00ecdc44b68ae389542755fe..f48e3907c311f502c4b34e83237f0e38ef60a83d 100644 (file)
@@ -285,6 +285,8 @@ iter_declaration(
    if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
       TXT(", ");
       ENM(decl->Resource.Resource, tgsi_texture_names);
+      if (decl->Resource.Raw)
+         TXT(", RAW");
    }
 
    if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
index 04862759b7f43f8e1644ce030933d6985b274df8..ad9b304f090696b5fa474a7f3db49ef582793d5a 100644 (file)
@@ -1015,7 +1015,7 @@ static boolean parse_declaration( struct translate_ctx *ctx )
    struct parsed_dcl_bracket brackets[2];
    int num_brackets;
    uint writemask;
-   const char *cur;
+   const char *cur, *cur2;
    uint advance;
    boolean is_vs_input;
    boolean is_imm_array;
@@ -1069,6 +1069,22 @@ static boolean parse_declaration( struct translate_ctx *ctx )
             return FALSE;
          }
 
+         cur2 = cur;
+         eat_opt_white(&cur2);
+         while (*cur2 == ',') {
+            cur2++;
+            eat_opt_white(&cur2);
+            if (str_match_no_case(&cur2, "RAW") &&
+                !is_digit_alpha_underscore(cur2)) {
+               decl.Resource.Raw = 1;
+
+            } else {
+               break;
+            }
+            cur = cur2;
+            eat_opt_white(&cur2);
+         }
+
          ctx->cur = cur;
 
       } else if (file == TGSI_FILE_SAMPLER_VIEW) {
@@ -1122,7 +1138,7 @@ static boolean parse_declaration( struct translate_ctx *ctx )
                }
                break;
             } else {
-               const char *cur2 = cur;
+               cur2 = cur;
                eat_opt_white( &cur2 );
                if (*cur2 == ',') {
                   cur2++;
index 6a1cb7e2e2c8ccd7c2365e796b608b35bab31490..eb8be46e354bf0e06887cc650ad3e75e5ae5aa98 100644 (file)
@@ -1745,7 +1745,7 @@ Declaration Resource
 
    Follows Declaration token if file is TGSI_FILE_RESOURCE.
 
-   DCL RES[#], resource
+   DCL RES[#], resource [, RAW]
 
    Declares a shader input resource and assigns it to a RES[#]
    register.
@@ -1753,6 +1753,19 @@ Declaration Resource
    resource can be one of BUFFER, 1D, 2D, 3D, CUBE, 1DArray and
    2DArray.
 
+   If the RAW keyword is not specified, the texture data will be
+   subject to conversion, swizzling and scaling as required to yield
+   the specified data type from the physical data format of the bound
+   resource.
+
+   If the RAW keyword is specified, no channel conversion will be
+   performed: the values read for each of the channels (X,Y,Z,W) will
+   correspond to consecutive words in the same order and format
+   they're found in memory.  No element-to-address conversion will be
+   performed either: the value of the provided X coordinate will be
+   interpreted in byte units instead of texel units.  The result of
+   accessing a misaligned address is undefined.
+
 
 Properties
 ^^^^^^^^^^^^^^^^^^^^^^^^
index a62d7a2b94debefc88fdd5e328d57e76edd4e8c9..3fc7a4715e3de35b254bef486118ba1a30e3681b 100644 (file)
@@ -169,7 +169,8 @@ struct tgsi_declaration_semantic
 
 struct tgsi_declaration_resource {
    unsigned Resource    : 8; /**< one of TGSI_TEXTURE_ */
-   unsigned Padding     : 24;
+   unsigned Raw         : 1;
+   unsigned Padding     : 23;
 };
 
 struct tgsi_declaration_sampler_view {