vkd3d-shader/hlsl: Implement the ByteAddressBuffer.Load*() methods.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov
2024-11-04 16:57:06 +01:00
committed by Henri Verbeet
parent 1a28e7d9c6
commit e5ba79b4f1
Notes: Henri Verbeet 2024-11-06 23:01:27 +01:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1245
6 changed files with 161 additions and 8 deletions

View File

@@ -0,0 +1,56 @@
[require]
shader model >= 4.0
[rtv 0]
format r32g32b32a32-uint
size (2d, 32, 32)
[srv 0]
format r32-typeless
size (raw_buffer, 4)
1 2 3 4
[pixel shader]
ByteAddressBuffer t;
uint offset;
uint count;
uint4 main() : sv_target
{
if (count == 1)
return uint4(t.Load(offset), 0xa, 0xb, 0xc);
if (count == 2)
return uint4(t.Load2(offset), 0xd, 0xe);
if (count == 3)
return uint4(t.Load3(offset), 0xf);
if (count == 4)
return t.Load4(offset);
return 0;
}
[test]
uniform 0 uint4 0 1 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x1, 0xa, 0xb, 0xc)
uniform 0 uint4 4 1 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x2, 0xa, 0xb, 0xc)
uniform 0 uint4 0 2 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x1, 0x2, 0xd, 0xe)
uniform 0 uint4 4 2 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x2, 0x3, 0xd, 0xe)
uniform 0 uint4 0 3 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x1, 0x2, 0x3, 0xf)
uniform 0 uint4 4 3 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x2, 0x3, 0x4, 0xf)
uniform 0 uint4 0 4 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x1, 0x2, 0x3, 0x4)
uniform 0 uint4 4 4 0 0
todo(msl | glsl) draw quad
probe (0, 0) rgbaui(0x2, 0x3, 0x4, 0x0)

View File

@@ -478,9 +478,19 @@ static void init_resource_srv_buffer(struct d3d11_shader_runner *runner, struct
resource->resource = (ID3D11Resource *)resource->buffer;
srv_desc.Format = params->desc.format;
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
srv_desc.Buffer.FirstElement = 0;
srv_desc.Buffer.NumElements = params->data_size / params->desc.texel_size;
if (params->is_raw)
{
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
srv_desc.BufferEx.FirstElement = 0;
srv_desc.BufferEx.NumElements = params->data_size / params->desc.texel_size;
srv_desc.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW;
}
else
{
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
srv_desc.Buffer.FirstElement = 0;
srv_desc.Buffer.NumElements = params->data_size / params->desc.texel_size;
}
hr = ID3D11Device_CreateShaderResourceView(device, resource->resource, &srv_desc, &resource->srv);
ok(hr == S_OK, "Failed to create view, hr %#lx.\n", hr);
}

View File

@@ -159,6 +159,7 @@ static struct resource *d3d12_runner_create_resource(struct shader_runner *r, co
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srv_desc.Buffer.NumElements = params->desc.width * params->desc.height;
srv_desc.Buffer.Flags = params->is_raw ? D3D12_BUFFER_SRV_FLAG_RAW : 0;
ID3D12Device_CreateShaderResourceView(device, resource->resource,
&srv_desc, get_cpu_descriptor_handle(test_context, runner->heap, resource->r.desc.slot));