mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/hlsl: Support packoffset().
This commit is contained in:
parent
4aca335f42
commit
7777c32cac
Notes:
Alexandre Julliard
2023-04-04 22:35:22 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Zebediah Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/106
@ -2905,17 +2905,51 @@ static const struct hlsl_buffer *get_reserved_buffer(struct hlsl_ctx *ctx, uint3
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void calculate_buffer_offset(struct hlsl_ir_var *var)
|
static void calculate_buffer_offset(struct hlsl_ctx *ctx, struct hlsl_ir_var *var)
|
||||||
{
|
{
|
||||||
|
unsigned int var_reg_size = var->data_type->reg_size[HLSL_REGSET_NUMERIC];
|
||||||
|
enum hlsl_type_class var_class = var->data_type->class;
|
||||||
struct hlsl_buffer *buffer = var->buffer;
|
struct hlsl_buffer *buffer = var->buffer;
|
||||||
|
|
||||||
buffer->size = hlsl_type_get_sm4_offset(var->data_type, buffer->size);
|
if (var->reg_reservation.offset_type == 'c')
|
||||||
|
{
|
||||||
|
if (var->reg_reservation.offset_index % 4)
|
||||||
|
{
|
||||||
|
if (var_class == HLSL_CLASS_MATRIX)
|
||||||
|
{
|
||||||
|
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION,
|
||||||
|
"packoffset() reservations with matrix types must be aligned with the beginning of a register.");
|
||||||
|
}
|
||||||
|
else if (var_class == HLSL_CLASS_ARRAY)
|
||||||
|
{
|
||||||
|
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION,
|
||||||
|
"packoffset() reservations with array types must be aligned with the beginning of a register.");
|
||||||
|
}
|
||||||
|
else if (var_class == HLSL_CLASS_STRUCT)
|
||||||
|
{
|
||||||
|
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION,
|
||||||
|
"packoffset() reservations with struct types must be aligned with the beginning of a register.");
|
||||||
|
}
|
||||||
|
else if (var_class == HLSL_CLASS_VECTOR)
|
||||||
|
{
|
||||||
|
unsigned int aligned_offset = hlsl_type_get_sm4_offset(var->data_type, var->reg_reservation.offset_index);
|
||||||
|
|
||||||
|
if (var->reg_reservation.offset_index != aligned_offset)
|
||||||
|
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION,
|
||||||
|
"packoffset() reservations with vector types cannot span multiple registers.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var->buffer_offset = var->reg_reservation.offset_index;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var->buffer_offset = hlsl_type_get_sm4_offset(var->data_type, buffer->size);
|
||||||
|
}
|
||||||
|
|
||||||
var->buffer_offset = buffer->size;
|
|
||||||
TRACE("Allocated buffer offset %u to %s.\n", var->buffer_offset, var->name);
|
TRACE("Allocated buffer offset %u to %s.\n", var->buffer_offset, var->name);
|
||||||
buffer->size += var->data_type->reg_size[HLSL_REGSET_NUMERIC];
|
buffer->size = max(buffer->size, var->buffer_offset + var_reg_size);
|
||||||
if (var->last_read)
|
if (var->last_read)
|
||||||
buffer->used_size = buffer->size;
|
buffer->used_size = max(buffer->used_size, var->buffer_offset + var_reg_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void allocate_buffers(struct hlsl_ctx *ctx)
|
static void allocate_buffers(struct hlsl_ctx *ctx)
|
||||||
@ -2931,7 +2965,7 @@ static void allocate_buffers(struct hlsl_ctx *ctx)
|
|||||||
if (var->is_param)
|
if (var->is_param)
|
||||||
var->buffer = ctx->params_buffer;
|
var->buffer = ctx->params_buffer;
|
||||||
|
|
||||||
calculate_buffer_offset(var);
|
calculate_buffer_offset(ctx, var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ uniform 0 float4 1.0 2.0 3.0 4.0
|
|||||||
uniform 4 float4 5.0 6.0 7.0 8.0
|
uniform 4 float4 5.0 6.0 7.0 8.0
|
||||||
uniform 8 float4 9.0 10.0 11.0 12.0
|
uniform 8 float4 9.0 10.0 11.0 12.0
|
||||||
draw quad
|
draw quad
|
||||||
todo probe all rgba (509, 610, 711, 812)
|
probe all rgba (509, 610, 711, 812)
|
||||||
|
|
||||||
|
|
||||||
[pixel shader]
|
[pixel shader]
|
||||||
@ -180,7 +180,7 @@ uniform 4 float4 4.0 5.0 6.0 7.0
|
|||||||
uniform 8 float4 8.0 9.0 10.0 11.0
|
uniform 8 float4 8.0 9.0 10.0 11.0
|
||||||
uniform 12 float4 12.0 13.0 14.0 15.0
|
uniform 12 float4 12.0 13.0 14.0 15.0
|
||||||
draw quad
|
draw quad
|
||||||
todo probe all rgba (12468.0, 13509.0, 14010.0, 15011.0)
|
probe all rgba (12468.0, 13509.0, 14010.0, 15011.0)
|
||||||
|
|
||||||
|
|
||||||
[pixel shader]
|
[pixel shader]
|
||||||
@ -197,10 +197,10 @@ float4 main() : sv_target
|
|||||||
[test]
|
[test]
|
||||||
uniform 0 float4 1.0 2.0 3.0 4.0
|
uniform 0 float4 1.0 2.0 3.0 4.0
|
||||||
draw quad
|
draw quad
|
||||||
todo probe all rgba (2.0, 3.0, 2.0, 3.0)
|
probe all rgba (2.0, 3.0, 2.0, 3.0)
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail todo]
|
[pixel shader fail]
|
||||||
// Elements must respect register boundaries.
|
// Elements must respect register boundaries.
|
||||||
cbuffer buffer
|
cbuffer buffer
|
||||||
{
|
{
|
||||||
@ -213,7 +213,7 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail todo]
|
[pixel shader fail]
|
||||||
// Matrices must be aligned.
|
// Matrices must be aligned.
|
||||||
cbuffer buffer
|
cbuffer buffer
|
||||||
{
|
{
|
||||||
@ -226,7 +226,7 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail todo]
|
[pixel shader fail]
|
||||||
// Arrays must be aligned.
|
// Arrays must be aligned.
|
||||||
cbuffer buffer
|
cbuffer buffer
|
||||||
{
|
{
|
||||||
@ -239,7 +239,7 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail todo]
|
[pixel shader fail]
|
||||||
// Structs must be aligned.
|
// Structs must be aligned.
|
||||||
struct apple
|
struct apple
|
||||||
{
|
{
|
||||||
@ -257,7 +257,7 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail todo]
|
[pixel shader fail]
|
||||||
// Invalid offset on unused buffer.
|
// Invalid offset on unused buffer.
|
||||||
cbuffer buffer
|
cbuffer buffer
|
||||||
{
|
{
|
||||||
@ -270,7 +270,7 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail todo]
|
[pixel shader fail]
|
||||||
// Invalid offset on unused variable.
|
// Invalid offset on unused variable.
|
||||||
cbuffer buffer
|
cbuffer buffer
|
||||||
{
|
{
|
||||||
@ -302,7 +302,7 @@ uniform 0 float 1.0
|
|||||||
uniform 1 float 2.0
|
uniform 1 float 2.0
|
||||||
uniform 4 float4 5.0 6.0 7.0 8.0
|
uniform 4 float4 5.0 6.0 7.0 8.0
|
||||||
draw quad
|
draw quad
|
||||||
todo probe all rgba (512.0, 612.0, 712.0, 812.0)
|
probe all rgba (512.0, 612.0, 712.0, 812.0)
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail todo]
|
[pixel shader fail todo]
|
||||||
@ -333,7 +333,7 @@ float4 main() : sv_target
|
|||||||
[test]
|
[test]
|
||||||
uniform 0 float4 1.0 2.0 3.0 4.0
|
uniform 0 float4 1.0 2.0 3.0 4.0
|
||||||
draw quad
|
draw quad
|
||||||
todo probe all rgba (3.0, 4.0, 3.0, 4.0)
|
probe all rgba (3.0, 4.0, 3.0, 4.0)
|
||||||
|
|
||||||
|
|
||||||
[pixel shader fail]
|
[pixel shader fail]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user