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:
@@ -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) {
|
||||
|
@@ -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");
|
||||
}
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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;
|
||||
};
|
||||
|
@@ -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] =
|
||||
|
@@ -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;
|
||||
|
@@ -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,
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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) ||
|
||||
|
@@ -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,
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user