On Wed, 12 Feb 2020 at 18:24, Paul Gofman gofmanp@gmail.com wrote:
@@ -5759,12 +5772,23 @@ HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined struct wined3d_adapter *adapter = wined3d->adapters[adapter_idx]; const struct wined3d_fragment_pipe_ops *fragment_pipeline; const struct wined3d_vertex_pipe_ops *vertex_pipeline;
struct wined3d_blend_state_desc blend_state_desc; unsigned int i; HRESULT hr;
if (!wined3d_select_feature_level(adapter, levels, level_count, &device->feature_level)) return E_FAIL;
memset(&blend_state_desc, 0, sizeof(blend_state_desc));
blend_state_desc.alpha_to_coverage = TRUE;
if (FAILED(hr = wined3d_blend_state_create(device, &blend_state_desc,
NULL, &wined3d_null_parent_ops, &device->blend_state_atoc_enabled)))
{
ERR("Could not create blend state object.\n");
return hr;
}
TRACE("Device feature level %s.\n", wined3d_debug_feature_level(device->feature_level));
device->ref = 1;
This leaks the blend state object on error paths.
You also don't reference count the blend state pointer in the wined3d_stateblock_state structure. That's not strictly required because the lifetime of the "blend_state_atoc_enabled" object is otherwise managed by the device, but it's also inconsistent with other objects in the wined3d_stateblock_state structure, which makes it a little ugly.