On Wed, 15 May 2019 at 19:39, Paul Gofman gofmanp@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.
+static void clamp_vec(float *dst, const float *src, unsigned int count,
float min_value, float max_value)
+{
- unsigned int i;
- for (i = 0; i < count; ++i)
dst[i] = clamp(src[i], min_value, max_value);
+}
The way this is used, that should probably be called "wined3d_color_clamp()".
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?
+#define D3DCOLOR_R_B(dw) (((BYTE)(dw)) << 16) +#define D3DCOLOR_G_B(dw) (((BYTE)(dw)) << 8) +#define D3DCOLOR_A_B(dw) (((BYTE)(dw)) << 24)
+static inline DWORD d3dcolor_from_wined3d_color(const struct wined3d_color *wined3d_color) +{
- return D3DCOLOR_R_B(lrint(wined3d_color->r * 255.0f)) | D3DCOLOR_G_B(lrint(wined3d_color->g * 255.0f))
| D3DCOLOR_B_B(lrint(wined3d_color->b * 255.0f)) | D3DCOLOR_A_B(lrint(wined3d_color->a * 255.0f));
+}
You're probably looking for wined3d_format_convert_from_float(). That's likely to be slightly slower than what you have here, but if performance were the main concern there would probably be other optimisations we could do first.