Signed-off-by: Atharva Nimbalkar atharvakn@gmail.com --- libs/vkd3d-shader/glsl.c | 58 +++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 6 deletions(-)
diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index 32458f0..afab2c3 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -219,13 +219,59 @@ static void shader_glsl_get_register_name(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_register *reg, enum vkd3d_data_type data_type, struct vkd3d_string_buffer *register_name, bool *is_swizzled) { - /* TODO: Add implementation - * Sets an error state as of now - */ - if(is_swizzled) + /* + * Currently adds support for input and output shaders. + * with support for relative addressing. + */ + + const struct vkd3d_shader_version *version = &gen->version; + const char *prefix = shader_get_type_prefix(version->type); + struct glsl_src_param rel_param0, rel_param1; + + rel_param0.param_str = vkd3d_string_buffer_get(&gen->string_buffers); + rel_param1.param_str = vkd3d_string_buffer_get(&gen->string_buffers); + if (reg->idx[0].offset != ~0u && reg->idx[0].rel_addr) + glsl_src_param_init_ext(gen, reg->idx[0].rel_addr, VKD3DSP_WRITEMASK_0, + &rel_param0, reg->idx[0].rel_addr->reg.data_type); + if (reg->idx[1].offset != ~0u && reg->idx[1].rel_addr) + glsl_src_param_init_ext(gen, reg->idx[1].rel_addr, VKD3DSP_WRITEMASK_0, + &rel_param1, reg->idx[1].rel_addr->reg.data_type); + if (is_swizzled) *is_swizzled = false; - vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, - "Internal compiler error: Unhandled register type %#x.", reg->type); + + switch (reg->type) + { + case VKD3DSPR_INPUT: + if (version->type == VKD3D_SHADER_TYPE_VERTEX) + { + if (reg->idx[0].rel_addr) + { + vkd3d_string_buffer_printf(register_name, "%s_in[%s + %u]", + prefix, rel_param0.param_str->buffer, reg->idx[0].offset); + } + else + { + vkd3d_string_buffer_printf(register_name, "%s_in%u", prefix, reg->idx[0].offset); + } + break; + } + break; + case VKD3DSPR_OUTPUT: + if (reg->idx[0].rel_addr) + vkd3d_string_buffer_printf(register_name, "%s_out[%s + %u]", + prefix, rel_param0.param_str->buffer, reg->idx[0].offset); + else + vkd3d_string_buffer_printf(register_name, "%s_out[%u]", prefix, reg->idx[0].offset); + break; + default: + vkd3d_string_buffer_printf(register_name, "unrecognised_register"); + vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, + "Unhandled register type %#x.\n", reg->type); + break; + } + + glsl_src_param_cleanup(&rel_param0, &gen->string_buffers); + glsl_src_param_cleanup(&rel_param1, &gen->string_buffers); }
static void shader_glsl_sprintf_cast(struct vkd3d_glsl_generator *gen,