Browse Source

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.
tags/i965-primitive-restart-v2
Francisco Jerez 13 years ago
parent
commit
b8e808f1ef

+ 4
- 0
src/gallium/auxiliary/tgsi/tgsi_build.c View 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);
}

+ 2
- 0
src/gallium/auxiliary/tgsi/tgsi_dump.c View 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");
}

+ 1
- 0
src/gallium/auxiliary/tgsi/tgsi_info.c View 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 *

+ 4
- 0
src/gallium/auxiliary/tgsi/tgsi_text.c View 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;
}

+ 2
- 1
src/gallium/docs/source/context.rst View 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
^^^^^^^^

+ 27
- 1
src/gallium/docs/source/tgsi.rst View 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
^^^^^^^^^^^^^^^^^^^^^^^^

+ 4
- 2
src/gallium/include/pipe/p_shader_tokens.h View 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] */

+ 1
- 0
src/gallium/include/pipe/p_state.h View 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 {

Loading…
Cancel
Save