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;
}
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
@@ -364,7 +367,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();
@@ -454,20 +457,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) {

View File

@@ -348,12 +348,14 @@ 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(", ");
UID(decl->Image.Format);
if (decl->Image.Writable)
TXT(", WR");
if (decl->Resource.Raw)
if (decl->Image.Raw)
TXT(", RAW");
}

View File

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

View File

@@ -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;
};

View File

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

View File

@@ -1251,10 +1251,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;
}
}
@@ -1263,16 +1263,18 @@ static boolean parse_declaration( struct translate_ctx *ctx )
return FALSE;
}
/* XXX format */
cur2 = cur;
eat_opt_white(&cur2);
while (*cur2 == ',') {
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;

View File

@@ -50,6 +50,7 @@ union tgsi_any_token {
struct tgsi_declaration_range decl_range;
struct tgsi_declaration_dimension decl_dim;
struct tgsi_declaration_interp decl_interp;
struct tgsi_declaration_image decl_image;
struct tgsi_declaration_semantic decl_semantic;
struct tgsi_declaration_sampler_view decl_sampler_view;
struct tgsi_declaration_array array;
@@ -154,6 +155,15 @@ struct ureg_program
} sampler_view[PIPE_MAX_SHADER_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 *local_temps;
struct util_bitmask *decl_temps;
@@ -656,6 +666,37 @@ ureg_DECL_sampler_view(struct ureg_program *ureg,
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
match_or_expand_immediate64( const unsigned *v,
int type,
@@ -1485,6 +1526,33 @@ emit_decl_sampler_view(struct ureg_program *ureg,
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
emit_immediate( struct ureg_program *ureg,
const unsigned *v,
@@ -1644,6 +1712,15 @@ static void emit_decls( struct ureg_program *ureg )
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) {
for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) {
emit_decl_range(ureg,

View File

@@ -326,6 +326,13 @@ ureg_DECL_sampler_view(struct ureg_program *,
unsigned return_type_z,
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
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;
switch (file) {
case TGSI_FILE_SAMPLER:
case TGSI_FILE_RESOURCE:
case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW:
type = TOY_TYPE_D;
break;
@@ -1834,7 +1834,7 @@ ra_get_src_indirect(struct toy_tgsi *tgsi,
src = tsrc_null();
break;
case TGSI_FILE_SAMPLER:
case TGSI_FILE_RESOURCE:
case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW:
is_resource = true;
/* fall through */
@@ -1918,7 +1918,7 @@ ra_get_src(struct toy_tgsi *tgsi,
need_vrf = true;
break;
case TGSI_FILE_SAMPLER:
case TGSI_FILE_RESOURCE:
case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW:
assert(!s->Register.Dimension);
src = tsrc_imm_d(s->Register.Index);
@@ -2256,7 +2256,7 @@ parse_declaration(struct toy_tgsi *tgsi,
case TGSI_FILE_SAMPLER:
case TGSI_FILE_PREDICATE:
case TGSI_FILE_ADDRESS:
case TGSI_FILE_RESOURCE:
case TGSI_FILE_IMAGE:
case TGSI_FILE_SAMPLER_VIEW:
/* nothing to do */
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_IMMEDIATE: return nv50_ir::FILE_IMMEDIATE;
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_NULL:
default:
@@ -871,7 +871,7 @@ bool Source::scanSource()
clipVertexOutput = -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;
@@ -1159,6 +1159,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
}
}
break;
/*
case TGSI_FILE_RESOURCE:
for (i = first; i <= last; ++i) {
resources[i].target = decl->Resource.Resource;
@@ -1166,6 +1167,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
resources[i].slot = i;
}
break;
*/
case TGSI_FILE_SAMPLER_VIEW:
for (i = first; i <= last; ++i)
textureViews[i].target = decl->SamplerView.Resource;
@@ -1231,11 +1233,13 @@ bool Source::scanInstruction(const struct tgsi_full_instruction *inst)
if (src.isIndirect(0))
mainTempsInLMem = true;
} else
/*
if (src.getFile() == TGSI_FILE_RESOURCE) {
if (src.getIndex(0) == TGSI_RESOURCE_GLOBAL)
info->io.globalAccess |= (insn.getOpcode() == TGSI_OPCODE_LOAD) ?
0x1 : 0x2;
} else
*/
if (src.getFile() == TGSI_FILE_OUTPUT) {
if (src.isIndirect(0)) {
// 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;
switch (getSrc(s).getFile()) {
/*
case TGSI_FILE_RESOURCE:
r = getSrc(s).getIndex(0);
return translateTexture(code->resources.at(r).target);
*/
case TGSI_FILE_SAMPLER_VIEW:
r = getSrc(s).getIndex(0);
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 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;
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);
return TRUE;
#if 0
case TGSI_FILE_RESOURCE:
/*opcode0.opcodeType = VGPU10_OPCODE_DCL_RESOURCE;*/
/* XXX more, VGPU10_RETURN_TYPE_FLOAT */
assert(!"TGSI_FILE_RESOURCE not handled yet");
return FALSE;
#endif
case TGSI_FILE_ADDRESS:
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_PREDICATE =8,
TGSI_FILE_SYSTEM_VALUE =9,
TGSI_FILE_RESOURCE =10,
TGSI_FILE_IMAGE =10,
TGSI_FILE_SAMPLER_VIEW =11,
TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */
};
@@ -197,11 +197,12 @@ struct tgsi_declaration_semantic
unsigned Padding : 8;
};
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 {