nouveau: codegen: LOAD: Take src swizzle into account
The llvm TGSI backend uses pointers in registers and does things like: LOAD TEMP[0].y, MEMORY[0], TEMP[0] Expecting the data at address TEMP[0].x to get loaded to TEMP[0].y. But this will cause the data at TEMP[0].x + 4 to be loaded instead. This commit adds support for a swizzle suffix for the 1st source operand, which allows using: LOAD TEMP[0].y, MEMORY[0].xxxx, TEMP[0] And actually getting the desired behavior Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -2288,6 +2288,9 @@ Resource Access Opcodes
|
|||||||
texture arrays and 2D textures. address.w is always
|
texture arrays and 2D textures. address.w is always
|
||||||
ignored.
|
ignored.
|
||||||
|
|
||||||
|
A swizzle suffix may be added to the resource argument
|
||||||
|
this will cause the resource data to be swizzled accordingly.
|
||||||
|
|
||||||
.. opcode:: STORE - Write data to a shader resource
|
.. opcode:: STORE - Write data to a shader resource
|
||||||
|
|
||||||
Syntax: ``STORE resource, address, src``
|
Syntax: ``STORE resource, address, src``
|
||||||
|
@@ -2385,14 +2385,18 @@ Converter::handleLOAD(Value *dst0[4])
|
|||||||
|
|
||||||
Value *off;
|
Value *off;
|
||||||
Symbol *sym;
|
Symbol *sym;
|
||||||
|
uint32_t src0_component_offset = tgsi.getSrc(0).getSwizzle(c) * 4;
|
||||||
|
|
||||||
if (tgsi.getSrc(1).getFile() == TGSI_FILE_IMMEDIATE) {
|
if (tgsi.getSrc(1).getFile() == TGSI_FILE_IMMEDIATE) {
|
||||||
off = NULL;
|
off = NULL;
|
||||||
sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c,
|
sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c,
|
||||||
tgsi.getSrc(1).getValueU32(0, info) + 4 * c);
|
tgsi.getSrc(1).getValueU32(0, info) +
|
||||||
|
src0_component_offset);
|
||||||
} else {
|
} else {
|
||||||
// yzw are ignored for buffers
|
// yzw are ignored for buffers
|
||||||
off = fetchSrc(1, 0);
|
off = fetchSrc(1, 0);
|
||||||
sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c, 4 * c);
|
sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c,
|
||||||
|
src0_component_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
Instruction *ld = mkLoad(TYPE_U32, dst0[c], sym, off);
|
Instruction *ld = mkLoad(TYPE_U32, dst0[c], sym, off);
|
||||||
|
Reference in New Issue
Block a user