On 3/6/20 10:33 AM, Henri Verbeet wrote:
On Fri, 6 Mar 2020 at 05:04, Zebediah Figura <z.figura12(a)gmail.com> wrote:
+ if (set_rasterizer_state) + { + struct wined3d_rasterizer_state *rasterizer_state; + struct wined3d_rasterizer_state_desc desc; + struct wine_rb_entry *entry; + + desc.fill_mode = state->rs[WINED3D_RS_FILLMODE]; + desc.front_ccw = FALSE; + desc.depth_bias_clamp = 0.0f; + desc.depth_clip = TRUE; + + if ((entry = wine_rb_get(&device->rasterizer_states, &desc))) + { + rasterizer_state = WINE_RB_ENTRY_VALUE(entry, struct wined3d_rasterizer_state, entry); + wined3d_device_set_rasterizer_state(device, rasterizer_state); + } ... +static int wined3d_rasterizer_state_compare(const void *key, const struct wine_rb_entry *entry) +{ + const struct wined3d_rasterizer_state *state = WINE_RB_ENTRY_VALUE(entry, struct wined3d_rasterizer_state, entry); + + return memcmp(&state->desc, key, sizeof(state->desc)); +}
This works, but note that it's a little fragile; you're depending on there not being any holes or padding in the wined3d_rasterizer_state_desc structure.
Sure; I saw similar places using memcmp(), and figured since there shouldn't be holes (at least on x86...) it'd be safe. Is it worth changing? [And if so, is it worth changing e.g. glsl_blitter_args_compare()?]