mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/hlsl: Write SM5.1 binding reflection data.
This commit is contained in:
parent
bb41947fc6
commit
33e5553158
Notes:
Henri Verbeet
2024-06-11 17:09:29 +02:00
Approved-by: Francisco Casas (@fcasas) Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/865
@ -3197,6 +3197,9 @@ static int sm4_compare_extern_resources(const void *a, const void *b)
|
|||||||
if ((r = vkd3d_u32_compare(aa->regset, bb->regset)))
|
if ((r = vkd3d_u32_compare(aa->regset, bb->regset)))
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
if ((r = vkd3d_u32_compare(aa->space, bb->space)))
|
||||||
|
return r;
|
||||||
|
|
||||||
return vkd3d_u32_compare(aa->index, bb->index);
|
return vkd3d_u32_compare(aa->index, bb->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3322,7 +3325,10 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
|
|||||||
|
|
||||||
extern_resources[*count].name = name;
|
extern_resources[*count].name = name;
|
||||||
extern_resources[*count].data_type = var->data_type;
|
extern_resources[*count].data_type = var->data_type;
|
||||||
extern_resources[*count].is_user_packed = !!var->reg_reservation.reg_type;
|
/* For some reason 5.1 resources aren't marked as
|
||||||
|
* user-packed, but cbuffers still are. */
|
||||||
|
extern_resources[*count].is_user_packed = hlsl_version_lt(ctx, 5, 1)
|
||||||
|
&& !!var->reg_reservation.reg_type;
|
||||||
|
|
||||||
extern_resources[*count].regset = r;
|
extern_resources[*count].regset = r;
|
||||||
extern_resources[*count].id = var->regs[r].id;
|
extern_resources[*count].id = var->regs[r].id;
|
||||||
@ -3377,6 +3383,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
|
|||||||
|
|
||||||
static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
||||||
{
|
{
|
||||||
|
uint32_t binding_desc_size = (hlsl_version_ge(ctx, 5, 1) ? 10 : 8) * sizeof(uint32_t);
|
||||||
size_t cbuffers_offset, resources_offset, creator_offset, string_offset;
|
size_t cbuffers_offset, resources_offset, creator_offset, string_offset;
|
||||||
unsigned int cbuffer_count = 0, extern_resources_count, i, j;
|
unsigned int cbuffer_count = 0, extern_resources_count, i, j;
|
||||||
size_t cbuffer_position, resource_position, creator_position;
|
size_t cbuffer_position, resource_position, creator_position;
|
||||||
@ -3418,7 +3425,7 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
put_u32(&buffer, hlsl_version_ge(ctx, 5, 1) ? TAG_RD11_REVERSE : TAG_RD11);
|
put_u32(&buffer, hlsl_version_ge(ctx, 5, 1) ? TAG_RD11_REVERSE : TAG_RD11);
|
||||||
put_u32(&buffer, 15 * sizeof(uint32_t)); /* size of RDEF header including this header */
|
put_u32(&buffer, 15 * sizeof(uint32_t)); /* size of RDEF header including this header */
|
||||||
put_u32(&buffer, 6 * sizeof(uint32_t)); /* size of buffer desc */
|
put_u32(&buffer, 6 * sizeof(uint32_t)); /* size of buffer desc */
|
||||||
put_u32(&buffer, (hlsl_version_ge(ctx, 5, 1) ? 10 : 8) * sizeof(uint32_t)); /* size of binding desc */
|
put_u32(&buffer, binding_desc_size); /* size of binding desc */
|
||||||
put_u32(&buffer, 10 * sizeof(uint32_t)); /* size of variable desc */
|
put_u32(&buffer, 10 * sizeof(uint32_t)); /* size of variable desc */
|
||||||
put_u32(&buffer, 9 * sizeof(uint32_t)); /* size of type desc */
|
put_u32(&buffer, 9 * sizeof(uint32_t)); /* size of type desc */
|
||||||
put_u32(&buffer, 3 * sizeof(uint32_t)); /* size of member desc */
|
put_u32(&buffer, 3 * sizeof(uint32_t)); /* size of member desc */
|
||||||
@ -3435,10 +3442,6 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
const struct extern_resource *resource = &extern_resources[i];
|
const struct extern_resource *resource = &extern_resources[i];
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
|
|
||||||
if (hlsl_version_ge(ctx, 5, 1))
|
|
||||||
hlsl_fixme(ctx, resource->buffer ? &resource->buffer->loc : &resource->var->loc,
|
|
||||||
"Shader model 5.1 resource reflection.");
|
|
||||||
|
|
||||||
if (resource->is_user_packed)
|
if (resource->is_user_packed)
|
||||||
flags |= D3D_SIF_USERPACKED;
|
flags |= D3D_SIF_USERPACKED;
|
||||||
|
|
||||||
@ -3465,6 +3468,12 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
put_u32(&buffer, resource->index);
|
put_u32(&buffer, resource->index);
|
||||||
put_u32(&buffer, resource->bind_count);
|
put_u32(&buffer, resource->bind_count);
|
||||||
put_u32(&buffer, flags);
|
put_u32(&buffer, flags);
|
||||||
|
|
||||||
|
if (hlsl_version_ge(ctx, 5, 1))
|
||||||
|
{
|
||||||
|
put_u32(&buffer, resource->space);
|
||||||
|
put_u32(&buffer, resource->id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < extern_resources_count; ++i)
|
for (i = 0; i < extern_resources_count; ++i)
|
||||||
@ -3472,7 +3481,7 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
const struct extern_resource *resource = &extern_resources[i];
|
const struct extern_resource *resource = &extern_resources[i];
|
||||||
|
|
||||||
string_offset = put_string(&buffer, resource->name);
|
string_offset = put_string(&buffer, resource->name);
|
||||||
set_u32(&buffer, resources_offset + i * 8 * sizeof(uint32_t), string_offset);
|
set_u32(&buffer, resources_offset + i * binding_desc_size, string_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Buffers. */
|
/* Buffers. */
|
||||||
|
@ -17,7 +17,7 @@ size (2d, 1, 1)
|
|||||||
size (2d, 1, 1)
|
size (2d, 1, 1)
|
||||||
2.0 2.0 2.0 99.0
|
2.0 2.0 2.0 99.0
|
||||||
|
|
||||||
[pixel shader todo]
|
[pixel shader]
|
||||||
Texture2D tex1 : register(t1, space0);
|
Texture2D tex1 : register(t1, space0);
|
||||||
|
|
||||||
float4 main() : sv_target
|
float4 main() : sv_target
|
||||||
@ -26,11 +26,11 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
[test]
|
[test]
|
||||||
todo(sm<6) draw quad
|
todo(glsl) draw quad
|
||||||
probe all rgba (1, 1, 1, 99)
|
probe all rgba (1, 1, 1, 99)
|
||||||
|
|
||||||
|
|
||||||
[pixel shader todo fail(sm>=6)]
|
[pixel shader fail(sm>=6)]
|
||||||
Texture2D tex1 : register(t1, sPaCe0);
|
Texture2D tex1 : register(t1, sPaCe0);
|
||||||
|
|
||||||
float4 main() : sv_target
|
float4 main() : sv_target
|
||||||
@ -39,7 +39,7 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
[test]
|
[test]
|
||||||
todo(sm<6) draw quad
|
todo(glsl) draw quad
|
||||||
probe all rgba (1, 1, 1, 99)
|
probe all rgba (1, 1, 1, 99)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user