From 586e1cc532b5dc5cd5a4b8e3ff62997d7b47a6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Fri, 6 Oct 2017 17:06:31 +0200 Subject: [PATCH] libs/vkd3d-shader: Implement relative addressing for constant buffers. --- libs/vkd3d-shader/spirv.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index cd9082f2..364978c6 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -2175,9 +2175,6 @@ static void vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co assert(reg->type != VKD3DSPR_IMMCONST); - if (reg->idx[0].rel_addr || reg->idx[1].rel_addr) - FIXME("Relative indexing not implemented.\n"); - if (reg->type == VKD3DSPR_TEMP) { assert(reg->idx[0].offset < compiler->temp_count); @@ -2200,9 +2197,10 @@ static void vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co uint32_t indexes[] = { vkd3d_dxbc_compiler_get_constant_uint(compiler, symbol->info.reg.member_idx), - vkd3d_dxbc_compiler_get_constant_uint(compiler, reg->idx[1].offset), + vkd3d_dxbc_compiler_emit_register_addressing(compiler, ®->idx[1]), }; + assert(!reg->idx[0].rel_addr); type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_FLOAT, VKD3D_VEC4_SIZE); ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, register_info->storage_class, type_id); register_info->id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id, @@ -2218,6 +2216,10 @@ static void vkd3d_dxbc_compiler_get_register_info(struct vkd3d_dxbc_compiler *co register_info->id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id, register_info->id, indexes, ARRAY_SIZE(indexes)); } + else if (reg->idx[0].rel_addr || reg->idx[1].rel_addr) + { + FIXME("Relative addressing not implemented.\n"); + } } static uint32_t vkd3d_dxbc_compiler_get_register_id(struct vkd3d_dxbc_compiler *compiler,