From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/hlsl_codegen.c | 39 +++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 13 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 8cb91770..8afd61f1 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -2864,26 +2864,39 @@ static void calculate_buffer_offset(struct hlsl_ctx *ctx, struct hlsl_ir_var *va unsigned int var_reg_size = var->data_type->reg_size[HLSL_REGSET_NUMERIC]; struct hlsl_buffer *buffer = var->buffer;
- if (var->offset_reservation.type == 'c') + if (ctx->profile->major_version >= 4) { - unsigned int proper_offset = hlsl_type_get_sm4_offset(var->data_type, - var->offset_reservation.index); - if (proper_offset != var->offset_reservation.index) + if (var->offset_reservation.type == 'c') { - hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION, - "Invalid packoffset() swizzle in reservation."); + unsigned int proper_offset = hlsl_type_get_sm4_offset(var->data_type, + var->offset_reservation.index); + if (proper_offset != var->offset_reservation.index) + { + hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION, + "Invalid packoffset() swizzle in reservation."); + } + var->buffer_offset = proper_offset; + } + else + { + var->buffer_offset = hlsl_type_get_sm4_offset(var->data_type, buffer->size); } - var->buffer_offset = proper_offset; + + TRACE("Allocated buffer offset %u to %s.\n", var->buffer_offset, var->name); + buffer->size = max(buffer->size, var->buffer_offset + var_reg_size); + if (var->last_read) + buffer->used_size = max(buffer->used_size, var->buffer_offset + var_reg_size); } else { - var->buffer_offset = hlsl_type_get_sm4_offset(var->data_type, buffer->size); + if (var->last_read) + { + var->buffer_offset = buffer->size; + TRACE("Allocated buffer offset %u to %s.\n", var->buffer_offset, var->name); + buffer->size += var_reg_size; + buffer->used_size = buffer->size; + } } - - TRACE("Allocated buffer offset %u to %s.\n", var->buffer_offset, var->name); - buffer->size = max(buffer->size, var->buffer_offset + var_reg_size); - if (var->last_read) - buffer->used_size = max(buffer->used_size, var->buffer_offset + var_reg_size); }
static void allocate_buffers(struct hlsl_ctx *ctx)