vkd3d-shader: Introduce an interface to specify 1.x texture dimensions.

This commit is contained in:
Elizabeth Figura
2025-10-03 15:00:48 -05:00
committed by Henri Verbeet
parent 937b80f3f2
commit 539a5be370
Notes: Henri Verbeet 2025-10-13 19:31:51 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1769
5 changed files with 128 additions and 1 deletions

View File

@@ -43,6 +43,58 @@ probe (480, 240) f32(1, 0, 1, 0)
probe (320, 360) f32(1, 1, 0, 0)
probe (480, 360) f32(1, 0, 0, 0)
[srv 0]
size (3d, 2, 2, 2)
1.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0
1.0 0.0 1.0 0.0 1.0 1.0 1.0 0.0
1.0 0.0 0.0 1.0 1.0 1.0 0.0 1.0
1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0
[test]
draw quad
probe (320, 240) f32(1, 1, 1, 1)
probe (480, 240) f32(1, 0, 1, 1)
probe (320, 360) f32(1, 1, 0, 1)
probe (480, 360) f32(1, 0, 0, 1)
[srv 0]
size (cube, 1)
1.0 0.0 0.0 0.0
1.0 0.0 0.1 0.0
1.0 0.0 0.2 0.0
1.0 0.0 0.3 0.0
1.0 0.0 0.4 0.0
1.0 0.0 0.5 0.0
[vertex shader]
float4 coord;
void main(inout float4 pos : position, out float4 tex : texcoord)
{
tex = coord;
}
[test]
uniform 0 float4 1 0 0 0
draw quad
probe (0, 0) f32(1.0, 0.0, 0.0, 0)
uniform 0 float4 -1 0 0 0
draw quad
probe (0, 0) f32(1.0, 0.0, 0.1, 0)
uniform 0 float4 0 1 0 0
draw quad
probe (0, 0) f32(1.0, 0.0, 0.2, 0)
uniform 0 float4 0 -1 0 0
draw quad
probe (0, 0) f32(1.0, 0.0, 0.3, 0)
uniform 0 float4 0 0 1 0
draw quad
probe (0, 0) f32(1.0, 0.0, 0.4, 0)
uniform 0 float4 0 0 -1 0
draw quad
probe (0, 0) f32(1.0, 0.0, 0.5, 0)
[vertex shader]
void main(inout float4 pos : position, out float4 tex : texcoord)
{

View File

@@ -354,6 +354,7 @@ static bool compile_hlsl_and_scan(struct vulkan_shader_runner *runner, enum shad
static bool compile_d3d_code(struct vulkan_shader_runner *runner,
enum shader_type type, struct vkd3d_shader_code *spirv)
{
struct vkd3d_shader_d3dbc_source_info d3dbc_source_info = {.type = VKD3D_SHADER_STRUCTURE_TYPE_D3DBC_SOURCE_INFO};
struct vkd3d_shader_varying_map_info varying_map_info = {.type = VKD3D_SHADER_STRUCTURE_TYPE_VARYING_MAP_INFO};
struct vkd3d_shader_spirv_target_info spirv_info = {.type = VKD3D_SHADER_STRUCTURE_TYPE_SPIRV_TARGET_INFO};
struct vkd3d_shader_interface_info interface_info = {.type = VKD3D_SHADER_STRUCTURE_TYPE_INTERFACE_INFO};
@@ -398,6 +399,28 @@ static bool compile_d3d_code(struct vulkan_shader_runner *runner,
ok(varying_map_info.varying_count <= ARRAY_SIZE(varying_map),
"Got unexpected count %u.\n", varying_map_info.varying_count);
}
else if (type == SHADER_TYPE_PS && info.source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
{
info.next = &d3dbc_source_info;
d3dbc_source_info.next = &spirv_info;
for (i = 0; i < runner->r.resource_count; ++i)
{
const struct resource *resource = runner->r.resources[i];
if (resource->desc.type != RESOURCE_TYPE_TEXTURE
|| resource->desc.slot > ARRAY_SIZE(d3dbc_source_info.texture_dimensions))
continue;
if (resource->desc.dimension == RESOURCE_DIMENSION_3D)
d3dbc_source_info.texture_dimensions[resource->desc.slot] = VKD3D_SHADER_RESOURCE_TEXTURE_3D;
else if (resource->desc.dimension == RESOURCE_DIMENSION_CUBE)
d3dbc_source_info.texture_dimensions[resource->desc.slot] = VKD3D_SHADER_RESOURCE_TEXTURE_CUBE;
else
d3dbc_source_info.texture_dimensions[resource->desc.slot] = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
}
}
spirv_info.next = &interface_info;
spirv_info.environment = VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0;