agx: Implement texture offsets and comparators
Texture offsets and shadow comparison values get grouped into a vector passed by register. Comparison values are provided as-is (fp32). Texture offsets are packed into nibbles, but we can do this on the CPU, as nonconstant offsets are forbidden in GLSL at least. They're also forbidden in Vulkan/SPIR-V without ImageGatherExtended/ shaderImageGatherExtended. I'm happy kicking the NIR lowering can down the line, this commit is complicated enough already. Passes dEQP-GLES3.functional.shaders.texture_functions.texture.* and dEQP-GLES3.functional.shaders.texture_functions.textureoffset.* Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18525>
This commit is contained in:

committed by
Marge Bot

parent
4f85a7be8c
commit
7a4e0a4d35
@@ -94,6 +94,8 @@ MASK = immediate("mask")
|
||||
BFI_MASK = immediate("bfi_mask")
|
||||
LOD_MODE = immediate("lod_mode", "enum agx_lod_mode")
|
||||
DIM = immediate("dim", "enum agx_dim")
|
||||
OFFSET = immediate("offset", "bool")
|
||||
SHADOW = immediate("shadow", "bool")
|
||||
SCOREBOARD = immediate("scoreboard")
|
||||
ICOND = immediate("icond", "enum agx_icond")
|
||||
FCOND = immediate("fcond", "enum agx_fcond")
|
||||
@@ -197,14 +199,14 @@ op("fcmpsel",
|
||||
encoding_32 = (0x02, 0x7F, 8, 10),
|
||||
srcs = 4, imms = [FCOND])
|
||||
|
||||
# sources are coordinates, LOD, texture, sampler, offset
|
||||
# sources are coordinates, LOD, texture, sampler, shadow/offset
|
||||
# TODO: anything else?
|
||||
op("texture_sample",
|
||||
encoding_32 = (0x31, 0x7F, 8, 10), # XXX WRONG SIZE
|
||||
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD])
|
||||
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET, SHADOW])
|
||||
op("texture_load",
|
||||
encoding_32 = (0x71, 0x7F, 8, 10), # XXX WRONG SIZE
|
||||
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD])
|
||||
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET])
|
||||
|
||||
# sources are base, index
|
||||
op("device_load",
|
||||
|
Reference in New Issue
Block a user