diff options
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.c | 12 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.h | 8 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 24 |
3 files changed, 30 insertions, 14 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index e1a72786476..ab1d03458ef 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -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]); diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h index 6a3b5ddf017..04a62a6e160 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h @@ -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, diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 92cd775feff..fcfd8b7ae92 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -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: |