dr.Resource = TGSI_BUFFER;
dr.Raw = 0;
+ dr.Writable = 0;
return dr;
}
static struct tgsi_declaration_resource
tgsi_build_declaration_resource(unsigned texture,
unsigned raw,
+ unsigned writable,
struct tgsi_declaration *declaration,
struct tgsi_header *header)
{
dr = tgsi_default_declaration_resource();
dr.Resource = texture;
dr.Raw = raw;
+ dr.Writable = writable;
declaration_grow(declaration, header);
*dr = tgsi_build_declaration_resource(full_decl->Resource.Resource,
full_decl->Resource.Raw,
+ full_decl->Resource.Writable,
declaration,
header);
}
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");
}
{ 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 *
!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;
}
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
^^^^^^^^
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
------------------------------
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.
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
^^^^^^^^^^^^^^^^^^^^^^^^
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 {
#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] */
unsigned height; /**< logical height in pixels */
unsigned usage; /**< bitmask of PIPE_BIND_x */
+ unsigned writable:1; /**< writable shader resource */
union {
struct {