From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- libs/vkd3d-shader/fx.c | 84 ++++++++++++++----- .../effect-shader-objects-fx_2.shader_test | 2 +- 2 files changed, 65 insertions(+), 21 deletions(-)
diff --git a/libs/vkd3d-shader/fx.c b/libs/vkd3d-shader/fx.c index fd7daaaf0..56561f6ed 100644 --- a/libs/vkd3d-shader/fx.c +++ b/libs/vkd3d-shader/fx.c @@ -160,6 +160,7 @@ static void fx_write_context_init(struct hlsl_ctx *ctx, const struct fx_write_co struct fx_write_context *fx) { unsigned int version = ctx->profile->major_version; + struct hlsl_block block;
memset(fx, 0, sizeof(*fx));
@@ -185,6 +186,11 @@ static void fx_write_context_init(struct hlsl_ctx *ctx, const struct fx_write_co list_init(&fx->types);
fx->child_effect = fx->ops->are_child_effects_supported && ctx->child_effect; + + hlsl_block_init(&block); + hlsl_prepend_global_uniform_copy(fx->ctx, &block); + hlsl_block_init(&block); + hlsl_calculate_buffer_offsets(fx->ctx); }
static int fx_write_context_cleanup(struct fx_write_context *fx) @@ -617,7 +623,8 @@ static uint32_t write_fx_2_parameter(const struct hlsl_type *type, const char *n { struct vkd3d_bytecode_buffer *buffer = &fx->unstructured; uint32_t semantic_offset, offset, elements_count = 0, name_offset; - uint32_t class; + struct hlsl_ctx *ctx = fx->ctx; + uint32_t class, type_value; static const uint32_t param_class[] = { [HLSL_CLASS_SCALAR] = D3DXPC_SCALAR, @@ -633,6 +640,14 @@ static uint32_t write_fx_2_parameter(const struct hlsl_type *type, const char *n [HLSL_TYPE_FLOAT] = D3DXPT_FLOAT, [HLSL_TYPE_VOID] = D3DXPT_VOID, }; + static const uint32_t param_texture_type[] = + { + [HLSL_SAMPLER_DIM_GENERIC] = D3DXPT_TEXTURE, + [HLSL_SAMPLER_DIM_1D] = D3DXPT_TEXTURE1D, + [HLSL_SAMPLER_DIM_2D] = D3DXPT_TEXTURE2D, + [HLSL_SAMPLER_DIM_3D] = D3DXPT_TEXTURE3D, + [HLSL_SAMPLER_DIM_CUBE] = D3DXPT_TEXTURECUBE, + }; size_t i;
/* Resolve arrays to element type and number of elements. */ @@ -656,6 +671,22 @@ static uint32_t write_fx_2_parameter(const struct hlsl_type *type, const char *n case HLSL_TYPE_BOOL: case HLSL_TYPE_INT: case HLSL_TYPE_VOID: + type_value = param_type[type->base_type]; + break; + case HLSL_TYPE_TEXTURE: + switch (type->sampler_dim) + { + case HLSL_SAMPLER_DIM_GENERIC: + case HLSL_SAMPLER_DIM_1D: + case HLSL_SAMPLER_DIM_2D: + case HLSL_SAMPLER_DIM_3D: + case HLSL_SAMPLER_DIM_CUBE: + type_value = param_texture_type[type->sampler_dim]; + break; + default: + hlsl_fixme(ctx, &ctx->location, "Unexpected sampler dim %u.\n", type->sampler_dim); + return 0; + } break; default: FIXME("Type %u is not supported.\n", type->base_type); @@ -663,7 +694,7 @@ static uint32_t write_fx_2_parameter(const struct hlsl_type *type, const char *n return 0; };
- offset = put_u32(buffer, param_type[type->base_type]); + offset = put_u32(buffer, type_value); put_u32(buffer, class); put_u32(buffer, name_offset); put_u32(buffer, semantic_offset); @@ -744,7 +775,9 @@ static uint32_t write_fx_2_initial_value(const struct hlsl_ir_var *var, struct f { struct vkd3d_bytecode_buffer *buffer = &fx->unstructured; const struct hlsl_type *type = var->data_type; - uint32_t i, offset, size, elements_count; + uint32_t value_offset = 0, offset, size, elements_count; + struct hlsl_ctx *ctx = fx->ctx; + uint32_t i, j;
if (type->class == HLSL_CLASS_ARRAY) { @@ -756,15 +789,35 @@ static uint32_t write_fx_2_initial_value(const struct hlsl_ir_var *var, struct f elements_count = 1; }
- size = get_fx_2_type_size(type) * elements_count; + size = get_fx_2_type_size(type);
- /* FIXME: write actual initial value */ - offset = put_u32(buffer, 0); - - for (i = 1; i < size / sizeof(uint32_t); ++i) - put_u32(buffer, 0); + for (i = 0; i < elements_count; ++i) + { + if (type->class == HLSL_CLASS_OBJECT) + { + switch (type->base_type) + { + case HLSL_TYPE_TEXTURE: + offset = put_u32(buffer, fx->object_variable_count++); + if (!value_offset) value_offset = offset; + break; + default: + hlsl_fixme(ctx, &ctx->location, "Writing initializer for object type %u is not implemented.\n", + type->base_type); + } + } + else + { + /* FIXME: write actual initial value */ + for (j = 0; j < size / sizeof(uint32_t); ++j) + { + offset = put_u32(buffer, 0); + if (!value_offset) value_offset = offset; + } + } + }
- return offset; + return value_offset; }
static void write_fx_2_parameters(struct fx_write_context *fx) @@ -773,11 +826,8 @@ static void write_fx_2_parameters(struct fx_write_context *fx) uint32_t desc_offset, value_offset; struct hlsl_ir_var *var;
- LIST_FOR_EACH_ENTRY(var, &fx->ctx->globals->vars, struct hlsl_ir_var, scope_entry) + LIST_FOR_EACH_ENTRY(var, &fx->ctx->extern_vars, struct hlsl_ir_var, extern_entry) { - if (var->data_type->class == HLSL_CLASS_OBJECT) - continue; - desc_offset = write_fx_2_parameter(var->data_type, var->name, &var->semantic, fx); value_offset = write_fx_2_initial_value(var, fx);
@@ -1002,12 +1052,6 @@ static void write_fx_4_buffer(struct hlsl_buffer *b, struct fx_write_context *fx static void write_buffers(struct fx_write_context *fx) { struct hlsl_buffer *buffer; - struct hlsl_block block; - - hlsl_block_init(&block); - hlsl_prepend_global_uniform_copy(fx->ctx, &block); - hlsl_block_init(&block); - hlsl_calculate_buffer_offsets(fx->ctx);
LIST_FOR_EACH_ENTRY(buffer, &fx->ctx->buffers, struct hlsl_buffer, entry) { diff --git a/tests/hlsl/effect-shader-objects-fx_2.shader_test b/tests/hlsl/effect-shader-objects-fx_2.shader_test index 7c6a8947a..8801ed1f7 100644 --- a/tests/hlsl/effect-shader-objects-fx_2.shader_test +++ b/tests/hlsl/effect-shader-objects-fx_2.shader_test @@ -26,7 +26,7 @@ float4 main() : sv_target return 0; }
-[effect] +[effect todo] vertexshader vs1; verteXshadeR vs2; pixelshader ps1;