Pārlūkot izejas kodu

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 pirms 13 gadiem
vecāks
revīzija
b8e808f1ef

+ 4
- 0
src/gallium/auxiliary/tgsi/tgsi_build.c Parādīt failu

@@ -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 Parādīt failu

@@ -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 Parādīt failu

@@ -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 Parādīt failu

@@ -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 Parādīt failu

@@ -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 Parādīt failu

@@ -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 Parādīt failu

@@ -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 Parādīt failu

@@ -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 {

Notiek ielāde…
Atcelt
Saglabāt