mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/hlsl: Put constant buffers into the extern_resources struct.
Mostly to get the same sorting logic.
This commit is contained in:
parent
558320b52f
commit
19a13740de
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
@ -3178,6 +3178,7 @@ struct extern_resource
|
|||||||
/* var is only not NULL if this resource is a whole variable, so it may be responsible for more
|
/* var is only not NULL if this resource is a whole variable, so it may be responsible for more
|
||||||
* than one component. */
|
* than one component. */
|
||||||
const struct hlsl_ir_var *var;
|
const struct hlsl_ir_var *var;
|
||||||
|
const struct hlsl_buffer *buffer;
|
||||||
|
|
||||||
char *name;
|
char *name;
|
||||||
struct hlsl_type *data_type;
|
struct hlsl_type *data_type;
|
||||||
@ -3220,6 +3221,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
|
|||||||
bool separate_components = ctx->profile->major_version == 5 && ctx->profile->minor_version == 0;
|
bool separate_components = ctx->profile->major_version == 5 && ctx->profile->minor_version == 0;
|
||||||
struct extern_resource *extern_resources = NULL;
|
struct extern_resource *extern_resources = NULL;
|
||||||
const struct hlsl_ir_var *var;
|
const struct hlsl_ir_var *var;
|
||||||
|
struct hlsl_buffer *buffer;
|
||||||
enum hlsl_regset regset;
|
enum hlsl_regset regset;
|
||||||
size_t capacity = 0;
|
size_t capacity = 0;
|
||||||
char *name;
|
char *name;
|
||||||
@ -3272,6 +3274,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
|
|||||||
hlsl_release_string_buffer(ctx, name_buffer);
|
hlsl_release_string_buffer(ctx, name_buffer);
|
||||||
|
|
||||||
extern_resources[*count].var = NULL;
|
extern_resources[*count].var = NULL;
|
||||||
|
extern_resources[*count].buffer = NULL;
|
||||||
|
|
||||||
extern_resources[*count].name = name;
|
extern_resources[*count].name = name;
|
||||||
extern_resources[*count].data_type = component_type;
|
extern_resources[*count].data_type = component_type;
|
||||||
@ -3313,6 +3316,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern_resources[*count].var = var;
|
extern_resources[*count].var = var;
|
||||||
|
extern_resources[*count].buffer = NULL;
|
||||||
|
|
||||||
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;
|
||||||
@ -3327,14 +3331,48 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY(buffer, &ctx->buffers, struct hlsl_buffer, entry)
|
||||||
|
{
|
||||||
|
if (!buffer->reg.allocated)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!(hlsl_array_reserve(ctx, (void **)&extern_resources, &capacity, *count + 1,
|
||||||
|
sizeof(*extern_resources))))
|
||||||
|
{
|
||||||
|
sm4_free_extern_resources(extern_resources, *count);
|
||||||
|
*count = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(name = hlsl_strdup(ctx, buffer->name)))
|
||||||
|
{
|
||||||
|
sm4_free_extern_resources(extern_resources, *count);
|
||||||
|
*count = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern_resources[*count].var = NULL;
|
||||||
|
extern_resources[*count].buffer = buffer;
|
||||||
|
|
||||||
|
extern_resources[*count].name = name;
|
||||||
|
extern_resources[*count].data_type = NULL;
|
||||||
|
extern_resources[*count].is_user_packed = !!buffer->reservation.reg_type;
|
||||||
|
|
||||||
|
extern_resources[*count].regset = HLSL_REGSET_NUMERIC;
|
||||||
|
extern_resources[*count].id = buffer->reg.id;
|
||||||
|
extern_resources[*count].bind_count = 1;
|
||||||
|
|
||||||
|
++*count;
|
||||||
|
}
|
||||||
|
|
||||||
qsort(extern_resources, *count, sizeof(*extern_resources), sm4_compare_extern_resources);
|
qsort(extern_resources, *count, sizeof(*extern_resources), sm4_compare_extern_resources);
|
||||||
return extern_resources;
|
return extern_resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
unsigned int cbuffer_count = 0, resource_count = 0, extern_resources_count, i, j;
|
|
||||||
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;
|
||||||
size_t cbuffer_position, resource_position, creator_position;
|
size_t cbuffer_position, resource_position, creator_position;
|
||||||
const struct hlsl_profile_info *profile = ctx->profile;
|
const struct hlsl_profile_info *profile = ctx->profile;
|
||||||
struct vkd3d_bytecode_buffer buffer = {0};
|
struct vkd3d_bytecode_buffer buffer = {0};
|
||||||
@ -3354,19 +3392,15 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
|
|
||||||
extern_resources = sm4_get_extern_resources(ctx, &extern_resources_count);
|
extern_resources = sm4_get_extern_resources(ctx, &extern_resources_count);
|
||||||
|
|
||||||
resource_count += extern_resources_count;
|
|
||||||
LIST_FOR_EACH_ENTRY(cbuffer, &ctx->buffers, struct hlsl_buffer, entry)
|
LIST_FOR_EACH_ENTRY(cbuffer, &ctx->buffers, struct hlsl_buffer, entry)
|
||||||
{
|
{
|
||||||
if (cbuffer->reg.allocated)
|
if (cbuffer->reg.allocated)
|
||||||
{
|
|
||||||
++cbuffer_count;
|
++cbuffer_count;
|
||||||
++resource_count;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
put_u32(&buffer, cbuffer_count);
|
put_u32(&buffer, cbuffer_count);
|
||||||
cbuffer_position = put_u32(&buffer, 0);
|
cbuffer_position = put_u32(&buffer, 0);
|
||||||
put_u32(&buffer, resource_count);
|
put_u32(&buffer, extern_resources_count);
|
||||||
resource_position = put_u32(&buffer, 0);
|
resource_position = put_u32(&buffer, 0);
|
||||||
put_u32(&buffer, vkd3d_make_u32(vkd3d_make_u16(profile->minor_version, profile->major_version),
|
put_u32(&buffer, vkd3d_make_u32(vkd3d_make_u16(profile->minor_version, profile->major_version),
|
||||||
target_types[profile->type]));
|
target_types[profile->type]));
|
||||||
@ -3396,20 +3430,18 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
|
|
||||||
if (hlsl_version_ge(ctx, 5, 1))
|
if (hlsl_version_ge(ctx, 5, 1))
|
||||||
hlsl_fixme(ctx, &resource->var->loc, "Shader model 5.1 resource reflection.");
|
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;
|
||||||
|
|
||||||
put_u32(&buffer, 0); /* name */
|
put_u32(&buffer, 0); /* name */
|
||||||
put_u32(&buffer, sm4_resource_type(resource->data_type));
|
if (resource->buffer)
|
||||||
if (resource->regset == HLSL_REGSET_SAMPLERS)
|
put_u32(&buffer, resource->buffer->type == HLSL_BUFFER_CONSTANT ? D3D_SIT_CBUFFER : D3D_SIT_TBUFFER);
|
||||||
{
|
|
||||||
put_u32(&buffer, 0);
|
|
||||||
put_u32(&buffer, 0);
|
|
||||||
put_u32(&buffer, 0);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
|
put_u32(&buffer, sm4_resource_type(resource->data_type));
|
||||||
|
if (resource->regset == HLSL_REGSET_TEXTURES || resource->regset == HLSL_REGSET_UAVS)
|
||||||
{
|
{
|
||||||
unsigned int dimx = hlsl_type_get_component_type(ctx, resource->data_type, 0)->e.resource.format->dimx;
|
unsigned int dimx = hlsl_type_get_component_type(ctx, resource->data_type, 0)->e.resource.format->dimx;
|
||||||
|
|
||||||
@ -3418,34 +3450,17 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
put_u32(&buffer, ~0u); /* FIXME: multisample count */
|
put_u32(&buffer, ~0u); /* FIXME: multisample count */
|
||||||
flags |= (dimx - 1) << VKD3D_SM4_SIF_TEXTURE_COMPONENTS_SHIFT;
|
flags |= (dimx - 1) << VKD3D_SM4_SIF_TEXTURE_COMPONENTS_SHIFT;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
put_u32(&buffer, 0);
|
||||||
|
put_u32(&buffer, 0);
|
||||||
|
put_u32(&buffer, 0);
|
||||||
|
}
|
||||||
put_u32(&buffer, resource->id);
|
put_u32(&buffer, resource->id);
|
||||||
put_u32(&buffer, resource->bind_count);
|
put_u32(&buffer, resource->bind_count);
|
||||||
put_u32(&buffer, flags);
|
put_u32(&buffer, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(cbuffer, &ctx->buffers, struct hlsl_buffer, entry)
|
|
||||||
{
|
|
||||||
uint32_t flags = 0;
|
|
||||||
|
|
||||||
if (!cbuffer->reg.allocated)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (hlsl_version_ge(ctx, 5, 1))
|
|
||||||
hlsl_fixme(ctx, &cbuffer->loc, "Shader model 5.1 resource reflection.");
|
|
||||||
|
|
||||||
if (cbuffer->reservation.reg_type)
|
|
||||||
flags |= D3D_SIF_USERPACKED;
|
|
||||||
|
|
||||||
put_u32(&buffer, 0); /* name */
|
|
||||||
put_u32(&buffer, cbuffer->type == HLSL_BUFFER_CONSTANT ? D3D_SIT_CBUFFER : D3D_SIT_TBUFFER);
|
|
||||||
put_u32(&buffer, 0); /* return type */
|
|
||||||
put_u32(&buffer, 0); /* dimension */
|
|
||||||
put_u32(&buffer, 0); /* multisample count */
|
|
||||||
put_u32(&buffer, cbuffer->reg.id); /* bind point */
|
|
||||||
put_u32(&buffer, 1); /* bind count */
|
|
||||||
put_u32(&buffer, flags); /* flags */
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < extern_resources_count; ++i)
|
for (i = 0; i < extern_resources_count; ++i)
|
||||||
{
|
{
|
||||||
const struct extern_resource *resource = &extern_resources[i];
|
const struct extern_resource *resource = &extern_resources[i];
|
||||||
@ -3454,15 +3469,6 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
set_u32(&buffer, resources_offset + i * 8 * sizeof(uint32_t), string_offset);
|
set_u32(&buffer, resources_offset + i * 8 * sizeof(uint32_t), string_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(cbuffer, &ctx->buffers, struct hlsl_buffer, entry)
|
|
||||||
{
|
|
||||||
if (!cbuffer->reg.allocated)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
string_offset = put_string(&buffer, cbuffer->name);
|
|
||||||
set_u32(&buffer, resources_offset + i++ * 8 * sizeof(uint32_t), string_offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Buffers. */
|
/* Buffers. */
|
||||||
|
|
||||||
cbuffers_offset = bytecode_align(&buffer);
|
cbuffers_offset = bytecode_align(&buffer);
|
||||||
@ -5840,7 +5846,8 @@ static void write_sm4_shdr(struct hlsl_ctx *ctx,
|
|||||||
const struct extern_resource *resource = &extern_resources[i];
|
const struct extern_resource *resource = &extern_resources[i];
|
||||||
|
|
||||||
if (hlsl_version_ge(ctx, 5, 1))
|
if (hlsl_version_ge(ctx, 5, 1))
|
||||||
hlsl_fixme(ctx, &resource->var->loc, "Shader model 5.1 resource declaration.");
|
hlsl_fixme(ctx, resource->buffer ? &resource->buffer->loc : &resource->var->loc,
|
||||||
|
"Shader model 5.1 resource declaration.");
|
||||||
|
|
||||||
if (resource->regset == HLSL_REGSET_SAMPLERS)
|
if (resource->regset == HLSL_REGSET_SAMPLERS)
|
||||||
write_sm4_dcl_samplers(&tpf, resource);
|
write_sm4_dcl_samplers(&tpf, resource);
|
||||||
@ -5903,7 +5910,7 @@ static void write_sm4_sfi0(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
|
|||||||
extern_resources = sm4_get_extern_resources(ctx, &extern_resources_count);
|
extern_resources = sm4_get_extern_resources(ctx, &extern_resources_count);
|
||||||
for (unsigned int i = 0; i < extern_resources_count; ++i)
|
for (unsigned int i = 0; i < extern_resources_count; ++i)
|
||||||
{
|
{
|
||||||
if (extern_resources[i].data_type->e.resource.rasteriser_ordered)
|
if (extern_resources[i].data_type && extern_resources[i].data_type->e.resource.rasteriser_ordered)
|
||||||
*flags |= VKD3D_SM4_REQUIRES_ROVS;
|
*flags |= VKD3D_SM4_REQUIRES_ROVS;
|
||||||
}
|
}
|
||||||
sm4_free_extern_resources(extern_resources, extern_resources_count);
|
sm4_free_extern_resources(extern_resources, extern_resources_count);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user