st/glsl_to_tgsi: provide Texture and Format information for image ops

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Nicolai Hähnle 2016-02-07 13:28:01 -05:00
parent 3243b6fc97
commit dfcf420412
3 changed files with 30 additions and 14 deletions

View File

@ -1242,7 +1242,9 @@ ureg_emit_texture_offset(struct ureg_program *ureg,
void
ureg_emit_memory(struct ureg_program *ureg,
unsigned extended_token,
unsigned qualifier)
unsigned qualifier,
unsigned texture,
unsigned format)
{
union tgsi_any_token *out, *insn;
@ -1253,6 +1255,8 @@ ureg_emit_memory(struct ureg_program *ureg,
out[0].value = 0;
out[0].insn_memory.Qualifier = qualifier;
out[0].insn_memory.Texture = texture;
out[0].insn_memory.Format = format;
}
void
@ -1413,7 +1417,9 @@ ureg_memory_insn(struct ureg_program *ureg,
unsigned nr_dst,
const struct ureg_src *src,
unsigned nr_src,
unsigned qualifier)
unsigned qualifier,
unsigned texture,
unsigned format)
{
struct ureg_emit_insn_result insn;
unsigned i;
@ -1430,7 +1436,7 @@ ureg_memory_insn(struct ureg_program *ureg,
nr_dst,
nr_src);
ureg_emit_memory(ureg, insn.extended_token, qualifier);
ureg_emit_memory(ureg, insn.extended_token, qualifier, texture, format);
for (i = 0; i < nr_dst; i++)
ureg_emit_dst(ureg, dst[i]);

View File

@ -541,7 +541,9 @@ ureg_memory_insn(struct ureg_program *ureg,
unsigned nr_dst,
const struct ureg_src *src,
unsigned nr_src,
unsigned qualifier);
unsigned qualifier,
unsigned texture,
unsigned format);
/***********************************************************************
* Internal instruction helpers, don't call these directly:
@ -582,7 +584,9 @@ ureg_emit_texture_offset(struct ureg_program *ureg,
void
ureg_emit_memory(struct ureg_program *ureg,
unsigned insn_token,
unsigned qualifier);
unsigned qualifier,
unsigned texture,
unsigned format);
void
ureg_emit_dst( struct ureg_program *ureg,

View File

@ -5572,7 +5572,7 @@ compile_tgsi_instruction(struct st_translate *t,
int num_dst;
int num_src;
unsigned tex_target;
unsigned tex_target = 0;
num_dst = num_inst_dst_regs(inst);
num_src = num_inst_src_regs(inst);
@ -5647,32 +5647,38 @@ compile_tgsi_instruction(struct st_translate *t,
for (i = num_src - 1; i >= 0; i--)
src[i + 1] = src[i];
num_src++;
if (inst->buffer.file == PROGRAM_MEMORY)
if (inst->buffer.file == PROGRAM_MEMORY) {
src[0] = t->shared_memory;
else if (inst->buffer.file == PROGRAM_BUFFER)
} else if (inst->buffer.file == PROGRAM_BUFFER) {
src[0] = t->buffers[inst->buffer.index];
else
} else {
src[0] = t->images[inst->buffer.index];
tex_target = st_translate_texture_target(inst->tex_target, inst->tex_shadow);
}
if (inst->buffer.reladdr)
src[0] = ureg_src_indirect(src[0], ureg_src(t->address[2]));
assert(src[0].File != TGSI_FILE_NULL);
ureg_memory_insn(ureg, inst->op, dst, num_dst, src, num_src,
inst->buffer_access);
inst->buffer_access,
tex_target, inst->image_format);
break;
case TGSI_OPCODE_STORE:
if (inst->buffer.file == PROGRAM_MEMORY)
if (inst->buffer.file == PROGRAM_MEMORY) {
dst[0] = ureg_dst(t->shared_memory);
else if (inst->buffer.file == PROGRAM_BUFFER)
} else if (inst->buffer.file == PROGRAM_BUFFER) {
dst[0] = ureg_dst(t->buffers[inst->buffer.index]);
else
} else {
dst[0] = ureg_dst(t->images[inst->buffer.index]);
tex_target = st_translate_texture_target(inst->tex_target, inst->tex_shadow);
}
dst[0] = ureg_writemask(dst[0], inst->dst[0].writemask);
if (inst->buffer.reladdr)
dst[0] = ureg_dst_indirect(dst[0], ureg_src(t->address[2]));
assert(dst[0].File != TGSI_FILE_NULL);
ureg_memory_insn(ureg, inst->op, dst, num_dst, src, num_src,
inst->buffer_access);
inst->buffer_access,
tex_target, inst->image_format);
break;
case TGSI_OPCODE_SCS: