gallium/tgsi: Add resource write-back support.
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.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
@@ -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");
|
||||
}
|
||||
|
@@ -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 *
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
^^^^^^^^
|
||||
|
@@ -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
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@@ -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] */
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user