diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index a034ba2bb17..3f73201c16c 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -9462,7 +9462,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE */ NULL, /* WINED3DSIH_DCL_TESSELLATOR_PARTITIONING */ NULL, /* WINED3DSIH_DCL_TGSM_RAW */ shader_glsl_nop, - /* WINED3DSIH_DCL_TGSM_STRUCTURED */ NULL, + /* WINED3DSIH_DCL_TGSM_STRUCTURED */ shader_glsl_nop, /* WINED3DSIH_DCL_THREAD_GROUP */ shader_glsl_nop, /* WINED3DSIH_DCL_UAV_RAW */ shader_glsl_nop, /* WINED3DSIH_DCL_UAV_STRUCTURED */ shader_glsl_nop, diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 1b245d4e83f..f79a922cbe5 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -1065,6 +1065,33 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st reg_maps->tgsm_count = reg_idx + 1; tgsm = ®_maps->tgsm[reg_idx]; tgsm->size = ins.declaration.tgsm_raw.byte_count / 4; + tgsm->stride = 0; + } + else + { + FIXME("Invalid instruction %#x for shader type %#x.\n", + ins.handler_idx, shader_version.type); + } + } + else if (ins.handler_idx == WINED3DSIH_DCL_TGSM_STRUCTURED) + { + unsigned int reg_idx = ins.declaration.tgsm_structured.reg.reg.idx[0].offset; + if (reg_idx >= MAX_TGSM_REGISTERS) + { + ERR("Invalid TGSM register index %u.\n", reg_idx); + break; + } + if (shader_version.type == WINED3D_SHADER_TYPE_COMPUTE) + { + struct wined3d_shader_tgsm *tgsm; + + if (!wined3d_array_reserve((void **)®_maps->tgsm, ®_maps->tgsm_capacity, + reg_idx + 1, sizeof(*reg_maps->tgsm))) + return E_OUTOFMEMORY; + reg_maps->tgsm_count = reg_idx + 1; + tgsm = ®_maps->tgsm[reg_idx]; + tgsm->stride = ins.declaration.tgsm_structured.byte_stride / 4; + tgsm->size = tgsm->stride * ins.declaration.tgsm_structured.structure_count; } else { diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c index 5cc01360935..a934cdb2b21 100644 --- a/dlls/wined3d/shader_sm4.c +++ b/dlls/wined3d/shader_sm4.c @@ -774,6 +774,8 @@ static void shader_sm5_read_dcl_tgsm_structured(struct wined3d_shader_instructio shader_sm4_read_dst_param(priv, &tokens, WINED3D_DATA_FLOAT, &ins->declaration.tgsm_structured.reg); ins->declaration.tgsm_structured.byte_stride = *tokens++; ins->declaration.tgsm_structured.structure_count = *tokens; + if (ins->declaration.tgsm_structured.byte_stride % 4) + FIXME("Byte stride %u is not multiple of 4.\n", ins->declaration.tgsm_structured.byte_stride); } static void shader_sm5_read_dcl_resource_structured(struct wined3d_shader_instruction *ins, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 3d06962e280..675dd507591 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1006,6 +1006,7 @@ struct wined3d_shader_structured_resource struct wined3d_shader_tgsm { unsigned int size; + unsigned int stride; }; struct wined3d_shader_tgsm_raw