[PATCH 04/11] wined3d: Use color source for output colors in process_vertices_strided().

Paul Gofman gofmanp at gmail.com
Thu May 16 13:23:42 CDT 2019


On 5/16/19 21:01, Henri Verbeet wrote:
> On Wed, 15 May 2019 at 19:39, Paul Gofman <gofmanp at gmail.com> wrote:
>> +static void color_from_mcs(struct wined3d_color *color, enum wined3d_material_color_source mcs,
>> +        const struct wined3d_color *material_color, unsigned int index,
>> +        const struct wined3d_stream_info *stream_info)
>> +{
>> +    const struct wined3d_stream_info_element *element = NULL;
>> +
>> +    switch (mcs)
>> +    {
>> +        case WINED3D_MCS_MATERIAL:
>> +            *color = *material_color;
>> +            return;
>> +        case WINED3D_MCS_COLOR1:
>> +            if (!(stream_info->use_map & (1u << WINED3D_FFP_DIFFUSE)))
>> +            {
>> +                color->r = color->g = color->b = color->a = 1.0f;
>> +                return;
>> +            }
>> +            element = &stream_info->elements[WINED3D_FFP_DIFFUSE];
>> +            break;
>> +        case WINED3D_MCS_COLOR2:
>> +            if (!(stream_info->use_map & (1u << WINED3D_FFP_SPECULAR)))
>> +            {
>> +                color->r = color->g = color->b = 0.0f;
>> +                color->a = 1.0f;
>> +                return;
>> +            }
>> +            element = &stream_info->elements[WINED3D_FFP_SPECULAR];
>> +            break;
>> +        default:
>> +            ERR("Invalid material color source %#x.\n", mcs);
>> +            break;
>> +    }
>> +    wined3d_color_from_d3dcolor(color, element ? *(const DWORD *)(element->data.addr + index * element->stride) : 0);
>> +}
> The naming perhaps doesn't make it obvious, but
> wined3d_color_from_d3dcolor() assumes the source format is
> WINED3DFMT_B8G8R8A8_UNORM. While that should always be true for ddraw,
> it isn't necessarily for d3d9.

Oh yeah, I should add a generic conversion function based on declaration 
type. Still, should I maybe add just FIXME now for if decltype is not 
_D3DCOLOR for now, and imlement a generic conversion later when I will 
be adding some tests for process vertices in higher Directx versions?

>>           if (dst_fvf & WINED3DFVF_SPECULAR)
>>           {
>> -            /* What's the color value in the feedback buffer? */
>> -            const struct wined3d_stream_info_element *element = &stream_info->elements[WINED3D_FFP_SPECULAR];
>> -            const DWORD *color_s = (const DWORD *)(element->data.addr + i * element->stride);
>> -            if (!(stream_info->use_map & (1u << WINED3D_FFP_SPECULAR)))
>> -            {
>> -                static BOOL warned = FALSE;
>> +            struct wined3d_color material_specular;
>>
>> -                if(!warned) {
>> -                    ERR("No specular color in source, but destination has one\n");
>> -                    warned = TRUE;
>> -                }
>> +            memset(&material_specular, 0, sizeof(material_specular));
>> +            color_from_mcs(&material_specular, specular_source, state->render_states[WINED3D_RS_SPECULARENABLE]
>> +                    ? &state->material.specular : &material_specular, i, stream_info);
> That memset() is redundant, right?
It's purpose is to provide zeroes for input material color if 
_RS_SPECULARENABLE is not set. How it is currently written, 
material_specular will end up uninitialized if I remove the memset and 
specular lihgting is not enabled.




More information about the wine-devel mailing list