tgsi: add ureg support for image decls

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Ilia Mirkin
2014-09-20 02:54:16 -04:00
parent 208bfc493d
commit 8cc9a8aa2a
12 changed files with 153 additions and 52 deletions

View File

@@ -259,36 +259,39 @@ tgsi_build_declaration_semantic(
return ds; return ds;
} }
static struct tgsi_declaration_resource static struct tgsi_declaration_image
tgsi_default_declaration_resource(void) tgsi_default_declaration_image(void)
{ {
struct tgsi_declaration_resource dr; struct tgsi_declaration_image di;
dr.Resource = TGSI_TEXTURE_BUFFER; di.Resource = TGSI_TEXTURE_BUFFER;
dr.Raw = 0; di.Raw = 0;
dr.Writable = 0; di.Writable = 0;
dr.Padding = 0; di.Format = 0;
di.Padding = 0;
return dr; return di;
} }
static struct tgsi_declaration_resource static struct tgsi_declaration_image
tgsi_build_declaration_resource(unsigned texture, tgsi_build_declaration_image(unsigned texture,
unsigned raw, unsigned format,
unsigned writable, unsigned raw,
struct tgsi_declaration *declaration, unsigned writable,
struct tgsi_header *header) struct tgsi_declaration *declaration,
struct tgsi_header *header)
{ {
struct tgsi_declaration_resource dr; struct tgsi_declaration_image di;
dr = tgsi_default_declaration_resource(); di = tgsi_default_declaration_image();
dr.Resource = texture; di.Resource = texture;
dr.Raw = raw; di.Format = format;
dr.Writable = writable; di.Raw = raw;
di.Writable = writable;
declaration_grow(declaration, header); declaration_grow(declaration, header);
return dr; return di;
} }
static struct tgsi_declaration_sampler_view static struct tgsi_declaration_sampler_view
@@ -364,7 +367,7 @@ tgsi_default_full_declaration( void )
full_declaration.Range = tgsi_default_declaration_range(); full_declaration.Range = tgsi_default_declaration_range();
full_declaration.Semantic = tgsi_default_declaration_semantic(); full_declaration.Semantic = tgsi_default_declaration_semantic();
full_declaration.Interp = tgsi_default_declaration_interp(); 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.SamplerView = tgsi_default_declaration_sampler_view();
full_declaration.Array = tgsi_default_declaration_array(); full_declaration.Array = tgsi_default_declaration_array();
@@ -454,20 +457,21 @@ tgsi_build_full_declaration(
header ); header );
} }
if (full_decl->Declaration.File == TGSI_FILE_RESOURCE) { if (full_decl->Declaration.File == TGSI_FILE_IMAGE) {
struct tgsi_declaration_resource *dr; struct tgsi_declaration_image *di;
if (maxsize <= size) { if (maxsize <= size) {
return 0; return 0;
} }
dr = (struct tgsi_declaration_resource *)&tokens[size]; di = (struct tgsi_declaration_image *)&tokens[size];
size++; size++;
*dr = tgsi_build_declaration_resource(full_decl->Resource.Resource, *di = tgsi_build_declaration_image(full_decl->Image.Resource,
full_decl->Resource.Raw, full_decl->Image.Format,
full_decl->Resource.Writable, full_decl->Image.Raw,
declaration, full_decl->Image.Writable,
header); declaration,
header);
} }
if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {

View File

@@ -348,12 +348,14 @@ iter_declaration(
} }
} }
if (decl->Declaration.File == TGSI_FILE_RESOURCE) { if (decl->Declaration.File == TGSI_FILE_IMAGE) {
TXT(", "); TXT(", ");
ENM(decl->Resource.Resource, tgsi_texture_names); ENM(decl->Image.Resource, tgsi_texture_names);
if (decl->Resource.Writable) TXT(", ");
UID(decl->Image.Format);
if (decl->Image.Writable)
TXT(", WR"); TXT(", WR");
if (decl->Resource.Raw) if (decl->Image.Raw)
TXT(", RAW"); TXT(", RAW");
} }

View File

@@ -121,8 +121,8 @@ tgsi_parse_token(
next_token( ctx, &decl->Semantic ); next_token( ctx, &decl->Semantic );
} }
if (decl->Declaration.File == TGSI_FILE_RESOURCE) { if (decl->Declaration.File == TGSI_FILE_IMAGE) {
next_token(ctx, &decl->Resource); next_token(ctx, &decl->Image);
} }
if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {

View File

@@ -64,7 +64,7 @@ struct tgsi_full_declaration
struct tgsi_declaration_dimension Dim; struct tgsi_declaration_dimension Dim;
struct tgsi_declaration_interp Interp; struct tgsi_declaration_interp Interp;
struct tgsi_declaration_semantic Semantic; struct tgsi_declaration_semantic Semantic;
struct tgsi_declaration_resource Resource; struct tgsi_declaration_image Image;
struct tgsi_declaration_sampler_view SamplerView; struct tgsi_declaration_sampler_view SamplerView;
struct tgsi_declaration_array Array; struct tgsi_declaration_array Array;
}; };

View File

@@ -54,8 +54,8 @@ static const char *tgsi_file_names[] =
"IMM", "IMM",
"PRED", "PRED",
"SV", "SV",
"RES", "IMAGE",
"SVIEW" "SVIEW",
}; };
const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] = const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =

View File

@@ -1251,10 +1251,10 @@ static boolean parse_declaration( struct translate_ctx *ctx )
cur++; cur++;
eat_opt_white( &cur ); eat_opt_white( &cur );
if (file == TGSI_FILE_RESOURCE) { if (file == TGSI_FILE_IMAGE) {
for (i = 0; i < TGSI_TEXTURE_COUNT; i++) { for (i = 0; i < TGSI_TEXTURE_COUNT; i++) {
if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) { if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) {
decl.Resource.Resource = i; decl.Image.Resource = i;
break; break;
} }
} }
@@ -1263,16 +1263,18 @@ static boolean parse_declaration( struct translate_ctx *ctx )
return FALSE; return FALSE;
} }
/* XXX format */
cur2 = cur; cur2 = cur;
eat_opt_white(&cur2); eat_opt_white(&cur2);
while (*cur2 == ',') { while (*cur2 == ',') {
cur2++; cur2++;
eat_opt_white(&cur2); eat_opt_white(&cur2);
if (str_match_nocase_whole(&cur2, "RAW")) { if (str_match_nocase_whole(&cur2, "RAW")) {
decl.Resource.Raw = 1; decl.Image.Raw = 1;
} else if (str_match_nocase_whole(&cur2, "WR")) { } else if (str_match_nocase_whole(&cur2, "WR")) {
decl.Resource.Writable = 1; decl.Image.Writable = 1;
} else { } else {
break; break;

View File

@@ -50,6 +50,7 @@ union tgsi_any_token {
struct tgsi_declaration_range decl_range; struct tgsi_declaration_range decl_range;
struct tgsi_declaration_dimension decl_dim; struct tgsi_declaration_dimension decl_dim;
struct tgsi_declaration_interp decl_interp; struct tgsi_declaration_interp decl_interp;
struct tgsi_declaration_image decl_image;
struct tgsi_declaration_semantic decl_semantic; struct tgsi_declaration_semantic decl_semantic;
struct tgsi_declaration_sampler_view decl_sampler_view; struct tgsi_declaration_sampler_view decl_sampler_view;
struct tgsi_declaration_array array; struct tgsi_declaration_array array;
@@ -154,6 +155,15 @@ struct ureg_program
} sampler_view[PIPE_MAX_SHADER_SAMPLER_VIEWS]; } sampler_view[PIPE_MAX_SHADER_SAMPLER_VIEWS];
unsigned nr_sampler_views; unsigned nr_sampler_views;
struct {
unsigned index;
unsigned target;
unsigned format;
boolean wr;
boolean raw;
} image[PIPE_MAX_SHADER_IMAGES];
unsigned nr_images;
struct util_bitmask *free_temps; struct util_bitmask *free_temps;
struct util_bitmask *local_temps; struct util_bitmask *local_temps;
struct util_bitmask *decl_temps; struct util_bitmask *decl_temps;
@@ -656,6 +666,37 @@ ureg_DECL_sampler_view(struct ureg_program *ureg,
return reg; return reg;
} }
/* Allocate a new image.
*/
struct ureg_src
ureg_DECL_image(struct ureg_program *ureg,
unsigned index,
unsigned target,
unsigned format,
boolean wr,
boolean raw)
{
struct ureg_src reg = ureg_src_register(TGSI_FILE_IMAGE, index);
unsigned i;
for (i = 0; i < ureg->nr_images; i++)
if (ureg->image[i].index == index)
return reg;
if (i < PIPE_MAX_SHADER_IMAGES) {
ureg->image[i].index = index;
ureg->image[i].target = target;
ureg->image[i].wr = wr;
ureg->image[i].raw = raw;
ureg->image[i].format = format;
ureg->nr_images++;
return reg;
}
assert(0);
return reg;
}
static int static int
match_or_expand_immediate64( const unsigned *v, match_or_expand_immediate64( const unsigned *v,
int type, int type,
@@ -1485,6 +1526,33 @@ emit_decl_sampler_view(struct ureg_program *ureg,
out[2].decl_sampler_view.ReturnTypeW = return_type_w; out[2].decl_sampler_view.ReturnTypeW = return_type_w;
} }
static void
emit_decl_image(struct ureg_program *ureg,
unsigned index,
unsigned target,
unsigned format,
boolean wr,
boolean raw)
{
union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 3);
out[0].value = 0;
out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
out[0].decl.NrTokens = 3;
out[0].decl.File = TGSI_FILE_IMAGE;
out[0].decl.UsageMask = 0xf;
out[1].value = 0;
out[1].decl_range.First = index;
out[1].decl_range.Last = index;
out[2].value = 0;
out[2].decl_image.Resource = target;
out[2].decl_image.Writable = wr;
out[2].decl_image.Raw = raw;
out[2].decl_image.Format = format;
}
static void static void
emit_immediate( struct ureg_program *ureg, emit_immediate( struct ureg_program *ureg,
const unsigned *v, const unsigned *v,
@@ -1644,6 +1712,15 @@ static void emit_decls( struct ureg_program *ureg )
ureg->sampler_view[i].return_type_w); ureg->sampler_view[i].return_type_w);
} }
for (i = 0; i < ureg->nr_images; i++) {
emit_decl_image(ureg,
ureg->image[i].index,
ureg->image[i].target,
ureg->image[i].format,
ureg->image[i].wr,
ureg->image[i].raw);
}
if (ureg->const_decls.nr_constant_ranges) { if (ureg->const_decls.nr_constant_ranges) {
for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) { for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) {
emit_decl_range(ureg, emit_decl_range(ureg,

View File

@@ -326,6 +326,13 @@ ureg_DECL_sampler_view(struct ureg_program *,
unsigned return_type_z, unsigned return_type_z,
unsigned return_type_w ); unsigned return_type_w );
struct ureg_src
ureg_DECL_image(struct ureg_program *ureg,
unsigned index,
unsigned target,
unsigned format,
boolean wr,
boolean raw);
static inline struct ureg_src static inline struct ureg_src
ureg_imm4f( struct ureg_program *ureg, ureg_imm4f( struct ureg_program *ureg,

View File

@@ -1593,7 +1593,7 @@ ra_get_type(struct toy_tgsi *tgsi, const struct tgsi_full_instruction *tgsi_inst
tgsi_inst->Src[operand].Register.File; tgsi_inst->Src[operand].Register.File;
switch (file) { switch (file) {
case TGSI_FILE_SAMPLER: case TGSI_FILE_SAMPLER:
case TGSI_FILE_RESOURCE: case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW: case TGSI_FILE_SAMPLER_VIEW:
type = TOY_TYPE_D; type = TOY_TYPE_D;
break; break;
@@ -1834,7 +1834,7 @@ ra_get_src_indirect(struct toy_tgsi *tgsi,
src = tsrc_null(); src = tsrc_null();
break; break;
case TGSI_FILE_SAMPLER: case TGSI_FILE_SAMPLER:
case TGSI_FILE_RESOURCE: case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW: case TGSI_FILE_SAMPLER_VIEW:
is_resource = true; is_resource = true;
/* fall through */ /* fall through */
@@ -1918,7 +1918,7 @@ ra_get_src(struct toy_tgsi *tgsi,
need_vrf = true; need_vrf = true;
break; break;
case TGSI_FILE_SAMPLER: case TGSI_FILE_SAMPLER:
case TGSI_FILE_RESOURCE: case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW: case TGSI_FILE_SAMPLER_VIEW:
assert(!s->Register.Dimension); assert(!s->Register.Dimension);
src = tsrc_imm_d(s->Register.Index); src = tsrc_imm_d(s->Register.Index);
@@ -2256,7 +2256,7 @@ parse_declaration(struct toy_tgsi *tgsi,
case TGSI_FILE_SAMPLER: case TGSI_FILE_SAMPLER:
case TGSI_FILE_PREDICATE: case TGSI_FILE_PREDICATE:
case TGSI_FILE_ADDRESS: case TGSI_FILE_ADDRESS:
case TGSI_FILE_RESOURCE: case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW: case TGSI_FILE_SAMPLER_VIEW:
/* nothing to do */ /* nothing to do */
break; break;

View File

@@ -352,7 +352,7 @@ static nv50_ir::DataFile translateFile(uint file)
case TGSI_FILE_PREDICATE: return nv50_ir::FILE_PREDICATE; case TGSI_FILE_PREDICATE: return nv50_ir::FILE_PREDICATE;
case TGSI_FILE_IMMEDIATE: return nv50_ir::FILE_IMMEDIATE; case TGSI_FILE_IMMEDIATE: return nv50_ir::FILE_IMMEDIATE;
case TGSI_FILE_SYSTEM_VALUE: return nv50_ir::FILE_SYSTEM_VALUE; case TGSI_FILE_SYSTEM_VALUE: return nv50_ir::FILE_SYSTEM_VALUE;
case TGSI_FILE_RESOURCE: return nv50_ir::FILE_MEMORY_GLOBAL; //case TGSI_FILE_RESOURCE: return nv50_ir::FILE_MEMORY_GLOBAL;
case TGSI_FILE_SAMPLER: case TGSI_FILE_SAMPLER:
case TGSI_FILE_NULL: case TGSI_FILE_NULL:
default: default:
@@ -871,7 +871,7 @@ bool Source::scanSource()
clipVertexOutput = -1; clipVertexOutput = -1;
textureViews.resize(scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1); textureViews.resize(scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1);
resources.resize(scan.file_max[TGSI_FILE_RESOURCE] + 1); //resources.resize(scan.file_max[TGSI_FILE_RESOURCE] + 1);
info->immd.bufSize = 0; info->immd.bufSize = 0;
@@ -1159,6 +1159,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
} }
} }
break; break;
/*
case TGSI_FILE_RESOURCE: case TGSI_FILE_RESOURCE:
for (i = first; i <= last; ++i) { for (i = first; i <= last; ++i) {
resources[i].target = decl->Resource.Resource; resources[i].target = decl->Resource.Resource;
@@ -1166,6 +1167,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
resources[i].slot = i; resources[i].slot = i;
} }
break; break;
*/
case TGSI_FILE_SAMPLER_VIEW: case TGSI_FILE_SAMPLER_VIEW:
for (i = first; i <= last; ++i) for (i = first; i <= last; ++i)
textureViews[i].target = decl->SamplerView.Resource; textureViews[i].target = decl->SamplerView.Resource;
@@ -1231,11 +1233,13 @@ bool Source::scanInstruction(const struct tgsi_full_instruction *inst)
if (src.isIndirect(0)) if (src.isIndirect(0))
mainTempsInLMem = true; mainTempsInLMem = true;
} else } else
/*
if (src.getFile() == TGSI_FILE_RESOURCE) { if (src.getFile() == TGSI_FILE_RESOURCE) {
if (src.getIndex(0) == TGSI_RESOURCE_GLOBAL) if (src.getIndex(0) == TGSI_RESOURCE_GLOBAL)
info->io.globalAccess |= (insn.getOpcode() == TGSI_OPCODE_LOAD) ? info->io.globalAccess |= (insn.getOpcode() == TGSI_OPCODE_LOAD) ?
0x1 : 0x2; 0x1 : 0x2;
} else } else
*/
if (src.getFile() == TGSI_FILE_OUTPUT) { if (src.getFile() == TGSI_FILE_OUTPUT) {
if (src.isIndirect(0)) { if (src.isIndirect(0)) {
// We don't know which one is accessed, just mark everything for // We don't know which one is accessed, just mark everything for
@@ -1286,9 +1290,11 @@ Instruction::getTexture(const tgsi::Source *code, int s) const
unsigned int r; unsigned int r;
switch (getSrc(s).getFile()) { switch (getSrc(s).getFile()) {
/*
case TGSI_FILE_RESOURCE: case TGSI_FILE_RESOURCE:
r = getSrc(s).getIndex(0); r = getSrc(s).getIndex(0);
return translateTexture(code->resources.at(r).target); return translateTexture(code->resources.at(r).target);
*/
case TGSI_FILE_SAMPLER_VIEW: case TGSI_FILE_SAMPLER_VIEW:
r = getSrc(s).getIndex(0); r = getSrc(s).getIndex(0);
return translateTexture(code->textureViews.at(r).target); return translateTexture(code->textureViews.at(r).target);
@@ -1696,7 +1702,7 @@ Converter::acquireDst(int d, int c)
const int idx = dst.getIndex(0); const int idx = dst.getIndex(0);
const int idx2d = dst.is2D() ? dst.getIndex(1) : 0; const int idx2d = dst.is2D() ? dst.getIndex(1) : 0;
if (dst.isMasked(c) || f == TGSI_FILE_RESOURCE) if (dst.isMasked(c)/* || f == TGSI_FILE_RESOURCE*/)
return NULL; return NULL;
if (dst.isIndirect(0) || if (dst.isIndirect(0) ||

View File

@@ -2298,11 +2298,13 @@ emit_vgpu10_declaration(struct svga_shader_emitter_v10 *emit,
emit->num_samplers = MAX2(emit->num_samplers, decl->Range.Last + 1); emit->num_samplers = MAX2(emit->num_samplers, decl->Range.Last + 1);
return TRUE; return TRUE;
#if 0
case TGSI_FILE_RESOURCE: case TGSI_FILE_RESOURCE:
/*opcode0.opcodeType = VGPU10_OPCODE_DCL_RESOURCE;*/ /*opcode0.opcodeType = VGPU10_OPCODE_DCL_RESOURCE;*/
/* XXX more, VGPU10_RETURN_TYPE_FLOAT */ /* XXX more, VGPU10_RETURN_TYPE_FLOAT */
assert(!"TGSI_FILE_RESOURCE not handled yet"); assert(!"TGSI_FILE_RESOURCE not handled yet");
return FALSE; return FALSE;
#endif
case TGSI_FILE_ADDRESS: case TGSI_FILE_ADDRESS:
emit->num_address_regs = MAX2(emit->num_address_regs, emit->num_address_regs = MAX2(emit->num_address_regs,

View File

@@ -76,7 +76,7 @@ enum tgsi_file_type {
TGSI_FILE_IMMEDIATE =7, TGSI_FILE_IMMEDIATE =7,
TGSI_FILE_PREDICATE =8, TGSI_FILE_PREDICATE =8,
TGSI_FILE_SYSTEM_VALUE =9, TGSI_FILE_SYSTEM_VALUE =9,
TGSI_FILE_RESOURCE =10, TGSI_FILE_IMAGE =10,
TGSI_FILE_SAMPLER_VIEW =11, TGSI_FILE_SAMPLER_VIEW =11,
TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */ TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */
}; };
@@ -197,11 +197,12 @@ struct tgsi_declaration_semantic
unsigned Padding : 8; unsigned Padding : 8;
}; };
struct tgsi_declaration_resource { struct tgsi_declaration_image {
unsigned Resource : 8; /**< one of TGSI_TEXTURE_ */ unsigned Resource : 8; /**< one of TGSI_TEXTURE_ */
unsigned Raw : 1; unsigned Raw : 1;
unsigned Writable : 1; unsigned Writable : 1;
unsigned Padding : 22; unsigned Format : 10; /**< one of PIPE_FORMAT_ */
unsigned Padding : 12;
}; };
enum tgsi_return_type { enum tgsi_return_type {