mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader: Introduce a function to build a varying map between sm1 stages.
This commit is contained in:
parent
d932fba7c3
commit
f649db23a5
Notes:
Alexandre Julliard
2023-08-03 21:25:28 +09:00
Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/280
@ -1743,6 +1743,8 @@ struct vkd3d_shader_next_stage_info
|
||||
* field is necessary to correctly match inter-stage varyings.
|
||||
* This mapping may also be necessary under other circumstances where the
|
||||
* varying interface does not match exactly.
|
||||
*
|
||||
* This mapping may be constructed by vkd3d_shader_build_varying_map().
|
||||
*/
|
||||
const struct vkd3d_shader_varying_map *varying_map;
|
||||
/** The number of registers provided in \ref varying_map. */
|
||||
@ -2262,6 +2264,35 @@ VKD3D_SHADER_API int vkd3d_shader_serialize_dxbc(size_t section_count,
|
||||
*/
|
||||
VKD3D_SHADER_API void vkd3d_shader_free_scan_signature_info(struct vkd3d_shader_scan_signature_info *info);
|
||||
|
||||
/**
|
||||
* Build a mapping of output varyings in a shader stage to input varyings in
|
||||
* the following shader stage.
|
||||
*
|
||||
* This mapping should be used in struct vkd3d_shader_next_stage_info to
|
||||
* compile the first shader.
|
||||
*
|
||||
* \param output_signature The output signature of the first shader.
|
||||
*
|
||||
* \param input_signature The input signature of the second shader.
|
||||
*
|
||||
* \param count On output, contains the number of entries written into
|
||||
* \ref varyings.
|
||||
*
|
||||
* \param varyings Pointer to an output array of varyings.
|
||||
* This must point to space for N varyings, where N is the number of elements
|
||||
* in the input signature.
|
||||
*
|
||||
* \remark Valid legacy Direct3D pixel shaders have at most 12 varying inputs:
|
||||
* 10 inter-stage varyings, face, and position.
|
||||
* Therefore, in practice, it is safe to call this function with a
|
||||
* pre-allocated array with a fixed size of 12.
|
||||
*
|
||||
* \since 1.9
|
||||
*/
|
||||
VKD3D_SHADER_API void vkd3d_shader_build_varying_map(const struct vkd3d_shader_signature *output_signature,
|
||||
const struct vkd3d_shader_signature *input_signature,
|
||||
unsigned int *count, struct vkd3d_shader_varying_map *varyings);
|
||||
|
||||
#endif /* VKD3D_SHADER_NO_PROTOTYPES */
|
||||
|
||||
/** Type of vkd3d_shader_get_version(). */
|
||||
|
@ -1891,3 +1891,41 @@ void shader_instruction_array_destroy(struct vkd3d_shader_instruction_array *ins
|
||||
vkd3d_free(instructions->icbs[i]);
|
||||
vkd3d_free(instructions->icbs);
|
||||
}
|
||||
|
||||
void vkd3d_shader_build_varying_map(const struct vkd3d_shader_signature *output_signature,
|
||||
const struct vkd3d_shader_signature *input_signature,
|
||||
unsigned int *ret_count, struct vkd3d_shader_varying_map *varyings)
|
||||
{
|
||||
unsigned int count = 0;
|
||||
unsigned int i;
|
||||
|
||||
TRACE("output_signature %p, input_signature %p, ret_count %p, varyings %p.\n",
|
||||
output_signature, input_signature, ret_count, varyings);
|
||||
|
||||
for (i = 0; i < input_signature->element_count; ++i)
|
||||
{
|
||||
const struct vkd3d_shader_signature_element *input_element, *output_element;
|
||||
|
||||
input_element = &input_signature->elements[i];
|
||||
|
||||
if (input_element->sysval_semantic != VKD3D_SHADER_SV_NONE)
|
||||
continue;
|
||||
|
||||
varyings[count].input_register_index = input_element->register_index;
|
||||
varyings[count].input_mask = input_element->mask;
|
||||
|
||||
if ((output_element = vkd3d_shader_find_signature_element(output_signature,
|
||||
input_element->semantic_name, input_element->semantic_index, 0)))
|
||||
{
|
||||
varyings[count].output_signature_index = output_element - output_signature->elements;
|
||||
}
|
||||
else
|
||||
{
|
||||
varyings[count].output_signature_index = output_signature->element_count;
|
||||
}
|
||||
|
||||
++count;
|
||||
}
|
||||
|
||||
*ret_count = count;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user