tgsi: update for images/buffers/memory support

This just pulls in a bunch of TGSI changes from upstream
that make adding GLES3.1 features easier.

Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
macos/master
Dave Airlie 7 years ago
parent bb81476211
commit 25957f89b8
  1. 117
      src/gallium/auxiliary/tgsi/tgsi_build.c
  2. 67
      src/gallium/auxiliary/tgsi/tgsi_dump.c
  3. 4
      src/gallium/auxiliary/tgsi/tgsi_info.c
  4. 8
      src/gallium/auxiliary/tgsi/tgsi_parse.c
  5. 3
      src/gallium/auxiliary/tgsi/tgsi_parse.h
  6. 12
      src/gallium/auxiliary/tgsi/tgsi_strings.c
  7. 1
      src/gallium/auxiliary/tgsi/tgsi_strings.h
  8. 111
      src/gallium/auxiliary/tgsi/tgsi_text.c
  9. 44
      src/gallium/include/pipe/p_shader_tokens.h

@ -269,36 +269,39 @@ tgsi_build_declaration_semantic(
return ds;
}
static struct tgsi_declaration_resource
tgsi_default_declaration_resource(void)
static struct tgsi_declaration_image
tgsi_default_declaration_image(void)
{
struct tgsi_declaration_resource dr;
struct tgsi_declaration_image di;
dr.Resource = TGSI_TEXTURE_BUFFER;
dr.Raw = 0;
dr.Writable = 0;
dr.Padding = 0;
di.Resource = TGSI_TEXTURE_BUFFER;
di.Raw = 0;
di.Writable = 0;
di.Format = 0;
di.Padding = 0;
return dr;
return di;
}
static struct tgsi_declaration_resource
tgsi_build_declaration_resource(unsigned texture,
unsigned raw,
unsigned writable,
struct tgsi_declaration *declaration,
struct tgsi_header *header)
static struct tgsi_declaration_image
tgsi_build_declaration_image(unsigned texture,
unsigned format,
unsigned raw,
unsigned writable,
struct tgsi_declaration *declaration,
struct tgsi_header *header)
{
struct tgsi_declaration_resource dr;
struct tgsi_declaration_image di;
dr = tgsi_default_declaration_resource();
dr.Resource = texture;
dr.Raw = raw;
dr.Writable = writable;
di = tgsi_default_declaration_image();
di.Resource = texture;
di.Format = format;
di.Raw = raw;
di.Writable = writable;
declaration_grow(declaration, header);
return dr;
return di;
}
static struct tgsi_declaration_sampler_view
@ -374,7 +377,7 @@ tgsi_default_full_declaration( void )
full_declaration.Range = tgsi_default_declaration_range();
full_declaration.Semantic = tgsi_default_declaration_semantic();
full_declaration.Interp = tgsi_default_declaration_interp();
full_declaration.Resource = tgsi_default_declaration_resource();
full_declaration.Image = tgsi_default_declaration_image();
full_declaration.SamplerView = tgsi_default_declaration_sampler_view();
full_declaration.Array = tgsi_default_declaration_array();
@ -468,20 +471,21 @@ tgsi_build_full_declaration(
header );
}
if (full_decl->Declaration.File == TGSI_FILE_RESOURCE) {
struct tgsi_declaration_resource *dr;
if (full_decl->Declaration.File == TGSI_FILE_IMAGE) {
struct tgsi_declaration_image *di;
if (maxsize <= size) {
return 0;
}
dr = (struct tgsi_declaration_resource *)&tokens[size];
di = (struct tgsi_declaration_image *)&tokens[size];
size++;
*dr = tgsi_build_declaration_resource(full_decl->Resource.Resource,
full_decl->Resource.Raw,
full_decl->Resource.Writable,
declaration,
header);
*di = tgsi_build_declaration_image(full_decl->Image.Resource,
full_decl->Image.Format,
full_decl->Image.Raw,
full_decl->Image.Writable,
declaration,
header);
}
if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
@ -733,6 +737,40 @@ tgsi_build_instruction_texture(
return instruction_texture;
}
static struct tgsi_instruction_memory
tgsi_default_instruction_memory( void )
{
struct tgsi_instruction_memory instruction_memory;
instruction_memory.Qualifier = 0;
instruction_memory.Texture = 0;
instruction_memory.Format = 0;
instruction_memory.Padding = 0;
return instruction_memory;
}
static struct tgsi_instruction_memory
tgsi_build_instruction_memory(
unsigned qualifier,
unsigned texture,
unsigned format,
struct tgsi_token *prev_token,
struct tgsi_instruction *instruction,
struct tgsi_header *header )
{
struct tgsi_instruction_memory instruction_memory;
instruction_memory.Qualifier = qualifier;
instruction_memory.Texture = texture;
instruction_memory.Format = format;
instruction_memory.Padding = 0;
instruction->Memory = 1;
instruction_grow( instruction, header );
return instruction_memory;
}
static struct tgsi_texture_offset
tgsi_default_texture_offset( void )
@ -978,6 +1016,7 @@ tgsi_default_full_instruction( void )
full_instruction.Instruction = tgsi_default_instruction();
full_instruction.Label = tgsi_default_instruction_label();
full_instruction.Texture = tgsi_default_instruction_texture();
full_instruction.Memory = tgsi_default_instruction_memory();
for( i = 0; i < TGSI_FULL_MAX_TEX_OFFSETS; i++ ) {
full_instruction.TexOffsets[i] = tgsi_default_texture_offset();
}
@ -1068,6 +1107,26 @@ tgsi_build_full_instruction(
prev_token = (struct tgsi_token *) texture_offset;
}
}
if (full_inst->Instruction.Memory) {
struct tgsi_instruction_memory *instruction_memory;
if( maxsize <= size )
return 0;
instruction_memory =
(struct tgsi_instruction_memory *) &tokens[size];
size++;
*instruction_memory = tgsi_build_instruction_memory(
full_inst->Memory.Qualifier,
full_inst->Memory.Texture,
full_inst->Memory.Format,
prev_token,
instruction,
header );
prev_token = (struct tgsi_token *) instruction_memory;
}
for( i = 0; i < full_inst->Instruction.NumDstRegs; i++ ) {
const struct tgsi_full_dst_register *reg = &full_inst->Dst[i];
struct tgsi_dst_register *dst_register;

@ -348,15 +348,32 @@ iter_declaration(
}
}
if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
if (decl->Declaration.File == TGSI_FILE_IMAGE) {
TXT(", ");
ENM(decl->Resource.Resource, tgsi_texture_names);
if (decl->Resource.Writable)
ENM(decl->Image.Resource, tgsi_texture_names);
TXT(", ");
TXT(util_format_name(decl->Image.Format));
if (decl->Image.Writable)
TXT(", WR");
if (decl->Resource.Raw)
if (decl->Image.Raw)
TXT(", RAW");
}
if (decl->Declaration.File == TGSI_FILE_BUFFER) {
if (decl->Declaration.Atomic)
TXT(", ATOMIC");
}
if (decl->Declaration.File == TGSI_FILE_MEMORY) {
switch (decl->Declaration.MemType) {
/* Note: ,GLOBAL is optional / the default */
case TGSI_MEMORY_TYPE_GLOBAL: TXT(", GLOBAL"); break;
case TGSI_MEMORY_TYPE_SHARED: TXT(", SHARED"); break;
case TGSI_MEMORY_TYPE_PRIVATE: TXT(", PRIVATE"); break;
case TGSI_MEMORY_TYPE_INPUT: TXT(", INPUT"); break;
}
}
if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
TXT(", ");
ENM(decl->SamplerView.Resource, tgsi_texture_names);
@ -593,17 +610,37 @@ iter_instruction(
}
}
switch (inst->Instruction.Opcode) {
case TGSI_OPCODE_IF:
case TGSI_OPCODE_UIF:
case TGSI_OPCODE_ELSE:
case TGSI_OPCODE_BGNLOOP:
case TGSI_OPCODE_ENDLOOP:
case TGSI_OPCODE_CAL:
case TGSI_OPCODE_BGNSUB:
TXT( " :" );
UID( inst->Label.Label );
break;
if (inst->Instruction.Memory) {
uint32_t qualifier = inst->Memory.Qualifier;
while (qualifier) {
int bit = ffs(qualifier) - 1;
qualifier &= ~(1U << bit);
TXT(", ");
ENM(bit, tgsi_memory_names);
}
if (inst->Memory.Texture) {
TXT( ", " );
ENM( inst->Memory.Texture, tgsi_texture_names );
}
if (inst->Memory.Format) {
TXT( ", " );
TXT( util_format_name(inst->Memory.Format) );
}
}
if (inst->Instruction.Label) {
switch (inst->Instruction.Opcode) {
case TGSI_OPCODE_IF:
case TGSI_OPCODE_UIF:
case TGSI_OPCODE_ELSE:
case TGSI_OPCODE_BGNLOOP:
case TGSI_OPCODE_ENDLOOP:
case TGSI_OPCODE_CAL:
case TGSI_OPCODE_BGNSUB:
TXT( " :" );
UID( inst->Label.Label );
break;
}
}
/* update indentation */

@ -142,14 +142,14 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
{ 0, 0, 0, 0, 1, 0, NONE, "ENDSUB", TGSI_OPCODE_ENDSUB },
{ 1, 1, 1, 0, 0, 0, OTHR, "TXQ_LZ", TGSI_OPCODE_TXQ_LZ },
{ 1, 1, 1, 0, 0, 0, OTHR, "TXQS", TGSI_OPCODE_TXQS },
{ 0, 0, 0, 0, 0, 0, NONE, "", 105 }, /* removed */
{ 1, 1, 0, 0, 0, 0, OTHR, "RESQ", TGSI_OPCODE_RESQ },
{ 0, 0, 0, 0, 0, 0, NONE, "", 106 }, /* removed */
{ 0, 0, 0, 0, 0, 0, NONE, "NOP", TGSI_OPCODE_NOP },
{ 1, 2, 0, 0, 0, 0, COMP, "FSEQ", TGSI_OPCODE_FSEQ },
{ 1, 2, 0, 0, 0, 0, COMP, "FSGE", TGSI_OPCODE_FSGE },
{ 1, 2, 0, 0, 0, 0, COMP, "FSLT", TGSI_OPCODE_FSLT },
{ 1, 2, 0, 0, 0, 0, COMP, "FSNE", TGSI_OPCODE_FSNE },
{ 0, 1, 0, 0, 0, 1, NONE, "", 112 }, /* removed */
{ 0, 1, 0, 0, 0, 0, OTHR, "MEMBAR", TGSI_OPCODE_MEMBAR },
{ 0, 1, 0, 0, 0, 0, NONE, "CALLNZ", TGSI_OPCODE_CALLNZ },
{ 0, 1, 0, 0, 0, 0, NONE, "", 114 }, /* removed */
{ 0, 1, 0, 0, 0, 0, NONE, "BREAKC", TGSI_OPCODE_BREAKC },

@ -121,8 +121,8 @@ tgsi_parse_token(
next_token( ctx, &decl->Semantic );
}
if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
next_token(ctx, &decl->Resource);
if (decl->Declaration.File == TGSI_FILE_IMAGE) {
next_token(ctx, &decl->Image);
}
if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
@ -191,6 +191,10 @@ tgsi_parse_token(
}
}
if (inst->Instruction.Memory) {
next_token(ctx, &inst->Memory);
}
assert( inst->Instruction.NumDstRegs <= TGSI_FULL_MAX_DST_REGISTERS );
for( i = 0; i < inst->Instruction.NumDstRegs; i++ ) {

@ -64,7 +64,7 @@ struct tgsi_full_declaration
struct tgsi_declaration_dimension Dim;
struct tgsi_declaration_interp Interp;
struct tgsi_declaration_semantic Semantic;
struct tgsi_declaration_resource Resource;
struct tgsi_declaration_image Image;
struct tgsi_declaration_sampler_view SamplerView;
struct tgsi_declaration_array Array;
};
@ -90,6 +90,7 @@ struct tgsi_full_instruction
struct tgsi_instruction Instruction;
struct tgsi_instruction_label Label;
struct tgsi_instruction_texture Texture;
struct tgsi_instruction_memory Memory;
struct tgsi_full_dst_register Dst[TGSI_FULL_MAX_DST_REGISTERS];
struct tgsi_full_src_register Src[TGSI_FULL_MAX_SRC_REGISTERS];
struct tgsi_texture_offset TexOffsets[TGSI_FULL_MAX_TEX_OFFSETS];

@ -54,8 +54,10 @@ static const char *tgsi_file_names[] =
"IMM",
"PRED",
"SV",
"RES",
"SVIEW"
"IMAGE",
"SVIEW",
"BUFFER",
"MEMORY",
};
const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =
@ -214,6 +216,12 @@ const char *tgsi_immediate_type_names[4] =
"FLT64"
};
const char *tgsi_memory_names[3] =
{
"COHERENT",
"RESTRICT",
"VOLATILE",
};
static inline void
tgsi_strings_check(void)

@ -62,6 +62,7 @@ extern const char *tgsi_fs_coord_pixel_center_names[2];
extern const char *tgsi_immediate_type_names[4];
extern const char *tgsi_memory_names[3];
const char *
tgsi_file_name(unsigned file);

@ -119,6 +119,42 @@ static boolean str_match_nocase_whole( const char **pcur, const char *str )
return FALSE;
}
/* Return the array index that matches starting at *pcur, where the string at
* *pcur is terminated by a non-digit non-letter non-underscore.
* Returns -1 if no match is found.
*
* On success, the pointer to the first string is moved to the end of the read
* word.
*/
static int str_match_name_from_array(const char **pcur,
const char * const *array,
unsigned array_size)
{
for (unsigned j = 0; j < array_size; ++j) {
if (str_match_nocase_whole(pcur, array[j]))
return j;
}
return -1;
}
/* Return the format corresponding to the name at *pcur.
* Returns -1 if there is no format name.
*
* On success, the pointer to the string is moved to the end of the read format
* name.
*/
static int str_match_format(const char **pcur)
{
for (unsigned i = 0; i < PIPE_FORMAT_COUNT; i++) {
const struct util_format_description *desc =
util_format_description(i);
if (desc && str_match_nocase_whole(pcur, desc->name)) {
return i;
}
}
return -1;
}
/* Eat until eol
*/
static void eat_until_eol( const char **pcur )
@ -1028,6 +1064,12 @@ parse_instruction(
inst.Texture.Texture = TGSI_TEXTURE_UNKNOWN;
}
if ((i >= TGSI_OPCODE_LOAD && i <= TGSI_OPCODE_ATOMIMAX) ||
i == TGSI_OPCODE_RESQ) {
inst.Instruction.Memory = 1;
inst.Memory.Qualifier = 0;
}
/* Parse instruction operands.
*/
for (i = 0; i < info->num_dst + info->num_src + info->is_tex; i++) {
@ -1079,6 +1121,41 @@ parse_instruction(
}
inst.Texture.NumOffsets = i;
cur = ctx->cur;
eat_opt_white(&cur);
for (; inst.Instruction.Memory && *cur == ',';
ctx->cur = cur, eat_opt_white(&cur)) {
int j;
cur++;
eat_opt_white(&cur);
j = str_match_name_from_array(&cur, tgsi_memory_names,
ARRAY_SIZE(tgsi_memory_names));
if (j >= 0) {
inst.Memory.Qualifier |= 1U << j;
continue;
}
j = str_match_name_from_array(&cur, tgsi_texture_names,
ARRAY_SIZE(tgsi_texture_names));
if (j >= 0) {
inst.Memory.Texture = j;
continue;
}
j = str_match_format(&cur);
if (j >= 0) {
inst.Memory.Format = j;
continue;
}
ctx->cur = cur;
report_error(ctx, "Expected memory qualifier, texture target, or format\n");
return FALSE;
}
cur = ctx->cur;
eat_opt_white( &cur );
if (info->is_branch && *cur == ':') {
@ -1240,10 +1317,10 @@ static boolean parse_declaration( struct translate_ctx *ctx )
cur++;
eat_opt_white( &cur );
if (file == TGSI_FILE_RESOURCE) {
if (file == TGSI_FILE_IMAGE) {
for (i = 0; i < TGSI_TEXTURE_COUNT; i++) {
if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) {
decl.Resource.Resource = i;
decl.Image.Resource = i;
break;
}
}
@ -1258,13 +1335,17 @@ static boolean parse_declaration( struct translate_ctx *ctx )
cur2++;
eat_opt_white(&cur2);
if (str_match_nocase_whole(&cur2, "RAW")) {
decl.Resource.Raw = 1;
decl.Image.Raw = 1;
} else if (str_match_nocase_whole(&cur2, "WR")) {
decl.Resource.Writable = 1;
decl.Image.Writable = 1;
} else {
break;
int format = str_match_format(&cur2);
if (format < 0)
break;
decl.Image.Format = format;
}
cur = cur2;
eat_opt_white(&cur2);
@ -1337,6 +1418,26 @@ static boolean parse_declaration( struct translate_ctx *ctx )
decl.SamplerView.ReturnTypeX;
}
ctx->cur = cur;
} else if (file == TGSI_FILE_BUFFER) {
if (str_match_nocase_whole(&cur, "ATOMIC")) {
decl.Declaration.Atomic = 1;
ctx->cur = cur;
}
} else if (file == TGSI_FILE_MEMORY) {
if (str_match_nocase_whole(&cur, "GLOBAL")) {
/* Note this is a no-op global is the default */
decl.Declaration.MemType = TGSI_MEMORY_TYPE_GLOBAL;
ctx->cur = cur;
} else if (str_match_nocase_whole(&cur, "SHARED")) {
decl.Declaration.MemType = TGSI_MEMORY_TYPE_SHARED;
ctx->cur = cur;
} else if (str_match_nocase_whole(&cur, "PRIVATE")) {
decl.Declaration.MemType = TGSI_MEMORY_TYPE_PRIVATE;
ctx->cur = cur;
} else if (str_match_nocase_whole(&cur, "INPUT")) {
decl.Declaration.MemType = TGSI_MEMORY_TYPE_INPUT;
ctx->cur = cur;
}
} else {
if (str_match_nocase_whole(&cur, "LOCAL")) {
decl.Declaration.Local = 1;

@ -76,8 +76,10 @@ enum tgsi_file_type {
TGSI_FILE_IMMEDIATE =7,
TGSI_FILE_PREDICATE =8,
TGSI_FILE_SYSTEM_VALUE =9,
TGSI_FILE_RESOURCE =10,
TGSI_FILE_IMAGE =10,
TGSI_FILE_SAMPLER_VIEW =11,
TGSI_FILE_BUFFER,
TGSI_FILE_MEMORY,
TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */
};
@ -115,6 +117,14 @@ enum tgsi_file_type {
#define TGSI_CYLINDRICAL_WRAP_Z (1 << 2)
#define TGSI_CYLINDRICAL_WRAP_W (1 << 3)
enum tgsi_memory_type {
TGSI_MEMORY_TYPE_GLOBAL, /* OpenCL global */
TGSI_MEMORY_TYPE_SHARED, /* OpenCL local / GLSL shared */
TGSI_MEMORY_TYPE_PRIVATE, /* OpenCL private */
TGSI_MEMORY_TYPE_INPUT, /* OpenCL kernel input params */
TGSI_MEMORY_TYPE_COUNT,
};
struct tgsi_declaration
{
unsigned Type : 4; /**< TGSI_TOKEN_TYPE_DECLARATION */
@ -127,7 +137,9 @@ struct tgsi_declaration
unsigned Invariant : 1; /**< invariant optimization? */
unsigned Local : 1; /**< optimize as subroutine local variable? */
unsigned Array : 1; /**< extra array info? */
unsigned Padding : 6;
unsigned Atomic : 1; /**< atomic only? for TGSI_FILE_BUFFER */
unsigned MemType : 2; /**< TGSI_MEMORY_TYPE_x for TGSI_FILE_MEMORY */
unsigned Padding : 3;
};
struct tgsi_declaration_range
@ -198,11 +210,12 @@ struct tgsi_declaration_semantic
unsigned StreamW : 2;
};
struct tgsi_declaration_resource {
struct tgsi_declaration_image {
unsigned Resource : 8; /**< one of TGSI_TEXTURE_ */
unsigned Raw : 1;
unsigned Writable : 1;
unsigned Padding : 22;
unsigned Format : 10; /**< one of PIPE_FORMAT_ */
unsigned Padding : 12;
};
enum tgsi_return_type {
@ -420,6 +433,7 @@ struct tgsi_property_data {
#define TGSI_OPCODE_ENDSUB 102
#define TGSI_OPCODE_TXQ_LZ 103 /* TXQ for mipmap level 0 */
#define TGSI_OPCODE_TXQS 104
#define TGSI_OPCODE_RESQ 105
/* gap */
#define TGSI_OPCODE_NOP 107
@ -428,7 +442,7 @@ struct tgsi_property_data {
#define TGSI_OPCODE_FSLT 110
#define TGSI_OPCODE_FSNE 111
/* gap */
#define TGSI_OPCODE_MEMBAR 112
#define TGSI_OPCODE_CALLNZ 113
/* gap */
#define TGSI_OPCODE_BREAKC 115
@ -727,6 +741,26 @@ struct tgsi_dst_register
unsigned Padding : 6;
};
#define TGSI_MEMORY_COHERENT (1 << 0)
#define TGSI_MEMORY_RESTRICT (1 << 1)
#define TGSI_MEMORY_VOLATILE (1 << 2)
/**
* Specifies the type of memory access to do for the LOAD/STORE instruction.
*/
struct tgsi_instruction_memory
{
unsigned Qualifier : 3; /* TGSI_MEMORY_ */
unsigned Texture : 8; /* only for images: TGSI_TEXTURE_ */
unsigned Format : 10; /* only for images: PIPE_FORMAT_ */
unsigned Padding : 11;
};
#define TGSI_MEMBAR_SHADER_BUFFER (1 << 0)
#define TGSI_MEMBAR_ATOMIC_BUFFER (1 << 1)
#define TGSI_MEMBAR_SHADER_IMAGE (1 << 2)
#define TGSI_MEMBAR_SHARED (1 << 3)
#define TGSI_MEMBAR_THREAD_GROUP (1 << 4)
#ifdef __cplusplus
}

Loading…
Cancel
Save