gallium/tgsi: Add resource write-back support.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 30 Apr 2012 18:20:29 +0000 (20:20 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 11 May 2012 10:39:41 +0000 (12:39 +0200)
Define a new STORE opcode with a role dual to the LOAD opcode, and add
flags to specify that a shader resource is intended for writing.

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

index 2945a0d63e7b1ced7c74f454671cd8aebbf8f1c8..8378075b3e94dfc7db4f7c33f09bffc6e8bd902f 100644 (file)
@@ -258,6 +258,7 @@ tgsi_default_declaration_resource(void)
 
    dr.Resource = TGSI_BUFFER;
    dr.Raw = 0;
+   dr.Writable = 0;
 
    return dr;
 }
@@ -265,6 +266,7 @@ tgsi_default_declaration_resource(void)
 static struct tgsi_declaration_resource
 tgsi_build_declaration_resource(unsigned texture,
                                 unsigned raw,
+                                unsigned writable,
                                 struct tgsi_declaration *declaration,
                                 struct tgsi_header *header)
 {
@@ -273,6 +275,7 @@ tgsi_build_declaration_resource(unsigned texture,
    dr = tgsi_default_declaration_resource();
    dr.Resource = texture;
    dr.Raw = raw;
+   dr.Writable = writable;
 
    declaration_grow(declaration, header);
 
@@ -443,6 +446,7 @@ tgsi_build_full_declaration(
 
       *dr = tgsi_build_declaration_resource(full_decl->Resource.Resource,
                                             full_decl->Resource.Raw,
+                                            full_decl->Resource.Writable,
                                             declaration,
                                             header);
    }
index f48e3907c311f502c4b34e83237f0e38ef60a83d..3685946687726b80f40d6505495cd1c5183bf1f8 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.Writable)
+         TXT(", WR");
       if (decl->Resource.Raw)
          TXT(", RAW");
    }
index c41288f658899667e7459d62f2c5abf6ba1acf52..46a9df113ca7f463bc90512849fc126d2abe5f87 100644 (file)
@@ -200,6 +200,7 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
    { 1, 1, 0, 0, 0, 0, COMP, "IABS", TGSI_OPCODE_IABS },
    { 1, 1, 0, 0, 0, 0, COMP, "ISSG", TGSI_OPCODE_ISSG },
    { 1, 2, 0, 0, 0, 0, OTHR, "LOAD", TGSI_OPCODE_LOAD },
+   { 1, 2, 0, 0, 0, 0, OTHR, "STORE", TGSI_OPCODE_STORE },
 };
 
 const struct tgsi_opcode_info *
index ad9b304f090696b5fa474a7f3db49ef582793d5a..52e30b401692c76f3aa2b97a127892102488a1f5 100644 (file)
@@ -1078,6 +1078,10 @@ static boolean parse_declaration( struct translate_ctx *ctx )
                 !is_digit_alpha_underscore(cur2)) {
                decl.Resource.Raw = 1;
 
+            } else if (str_match_no_case(&cur2, "WR") &&
+                !is_digit_alpha_underscore(cur2)) {
+               decl.Resource.Writable = 1;
+
             } else {
                break;
             }
index eae400d5d5beca80ef1a19a6f9e276fada05f3a9..d17ea4289da0cdfd4d0e96401d66adf511f2890e 100644 (file)
@@ -134,7 +134,8 @@ the ``level``, ``first_layer`` and ``last_layer`` pipe_surface fields
 specify the mipmap level and the range of layers the texture will be
 constrained to.  In the case of buffers, ``first_element`` and
 ``last_element`` specify the range within the buffer that will be used
-by the shader resource.
+by the shader resource.  Writes to a shader resource are only allowed
+when the ``writable`` flag is set.
 
 Surfaces
 ^^^^^^^^
index eb8be46e354bf0e06887cc650ad3e75e5ae5aa98..f32aff1c7b3c9a493ad30fcf1a0949c46a5a7ac1 100644 (file)
@@ -1490,6 +1490,29 @@ Resource Access Opcodes
                texture arrays and 2D textures.  address.w is always
                ignored.
 
+.. opcode:: STORE - Write data to a shader resource
+
+               Syntax: ``STORE resource, address, src``
+
+               Example: ``STORE RES[0], TEMP[0], TEMP[1]``
+
+               Using the provided integer address, STORE writes data
+               to the specified buffer or texture.
+
+               The 'address' is specified as a vector of unsigned
+               integers.  If the 'address' is out of range the result
+               is unspecified.
+
+               Only the first mipmap level of a resource can be
+               written to using this instruction.
+
+               For 1D or 2D texture arrays, the array index is
+               provided as an unsigned integer in address.y or
+               address.z, respectively.  address.yz are ignored for
+               buffers and 1D textures.  address.z is ignored for 1D
+               texture arrays and 2D textures.  address.w is always
+               ignored.
+
 
 Explanation of symbols used
 ------------------------------
@@ -1745,7 +1768,7 @@ Declaration Resource
 
    Follows Declaration token if file is TGSI_FILE_RESOURCE.
 
-   DCL RES[#], resource [, RAW]
+   DCL RES[#], resource [, WR] [, RAW]
 
    Declares a shader input resource and assigns it to a RES[#]
    register.
@@ -1766,6 +1789,9 @@ Declaration Resource
    interpreted in byte units instead of texel units.  The result of
    accessing a misaligned address is undefined.
 
+   Usage of the STORE opcode is only allowed if the WR (writable) flag
+   is set.
+
 
 Properties
 ^^^^^^^^^^^^^^^^^^^^^^^^
index 3fc7a4715e3de35b254bef486118ba1a30e3681b..d45a914924e5f149ca9c6de3342a2920ef016616 100644 (file)
@@ -170,7 +170,8 @@ struct tgsi_declaration_semantic
 struct tgsi_declaration_resource {
    unsigned Resource    : 8; /**< one of TGSI_TEXTURE_ */
    unsigned Raw         : 1;
-   unsigned Padding     : 23;
+   unsigned Writable    : 1;
+   unsigned Padding     : 22;
 };
 
 struct tgsi_declaration_sampler_view {
@@ -406,8 +407,9 @@ struct tgsi_property_data {
 #define TGSI_OPCODE_ISSG                160
 
 #define TGSI_OPCODE_LOAD                161
+#define TGSI_OPCODE_STORE               162
 
-#define TGSI_OPCODE_LAST                162
+#define TGSI_OPCODE_LAST                163
 
 #define TGSI_SAT_NONE            0  /* do not saturate */
 #define TGSI_SAT_ZERO_ONE        1  /* clamp to [0,1] */
index 788ded58dcd83c96d2020e24a9ccbdee52fc66f8..7e741cfd98878a30c94e6e9a6dd03522b67317bf 100644 (file)
@@ -338,6 +338,7 @@ struct pipe_surface
    unsigned height;              /**< logical height in pixels */
 
    unsigned usage;               /**< bitmask of PIPE_BIND_x */
+   unsigned writable:1;          /**< writable shader resource */
 
    union {
       struct {