Commit 0e8f2786 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Keep a reference to the resource in shader resource views.

parent 08b06b7d
...@@ -987,6 +987,7 @@ static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl ...@@ -987,6 +987,7 @@ static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl
HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view, struct d3d10_device *device, HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view, struct d3d10_device *device,
ID3D10Resource *resource, const D3D10_SHADER_RESOURCE_VIEW_DESC *desc) ID3D10Resource *resource, const D3D10_SHADER_RESOURCE_VIEW_DESC *desc)
{ {
struct wined3d_resource *wined3d_resource;
HRESULT hr; HRESULT hr;
view->ID3D10ShaderResourceView_iface.lpVtbl = &d3d10_shader_resource_view_vtbl; view->ID3D10ShaderResourceView_iface.lpVtbl = &d3d10_shader_resource_view_vtbl;
...@@ -1002,7 +1003,14 @@ HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view, ...@@ -1002,7 +1003,14 @@ HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view,
view->desc = *desc; view->desc = *desc;
} }
if (FAILED(hr = wined3d_shader_resource_view_create(view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view))) if (!(wined3d_resource = wined3d_resource_from_resource(resource)))
{
ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource);
return E_FAIL;
}
if (FAILED(hr = wined3d_shader_resource_view_create(wined3d_resource,
view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view)))
{ {
WARN("Failed to create wined3d shader resource view, hr %#x.\n", hr); WARN("Failed to create wined3d shader resource view, hr %#x.\n", hr);
return hr; return hr;
......
...@@ -176,7 +176,10 @@ ULONG CDECL wined3d_shader_resource_view_decref(struct wined3d_shader_resource_v ...@@ -176,7 +176,10 @@ ULONG CDECL wined3d_shader_resource_view_decref(struct wined3d_shader_resource_v
if (!refcount) if (!refcount)
{ {
/* Call wined3d_object_destroyed() before releasing the resource,
* since releasing the resource may end up destroying the parent. */
view->parent_ops->wined3d_object_destroyed(view->parent); view->parent_ops->wined3d_object_destroyed(view->parent);
wined3d_resource_decref(view->resource);
HeapFree(GetProcessHeap(), 0, view); HeapFree(GetProcessHeap(), 0, view);
} }
...@@ -190,8 +193,8 @@ void * CDECL wined3d_shader_resource_view_get_parent(const struct wined3d_shader ...@@ -190,8 +193,8 @@ void * CDECL wined3d_shader_resource_view_get_parent(const struct wined3d_shader
return view->parent; return view->parent;
} }
HRESULT CDECL wined3d_shader_resource_view_create(void *parent, const struct wined3d_parent_ops *parent_ops, HRESULT CDECL wined3d_shader_resource_view_create(struct wined3d_resource *resource, void *parent,
struct wined3d_shader_resource_view **view) const struct wined3d_parent_ops *parent_ops, struct wined3d_shader_resource_view **view)
{ {
struct wined3d_shader_resource_view *object; struct wined3d_shader_resource_view *object;
...@@ -201,6 +204,8 @@ HRESULT CDECL wined3d_shader_resource_view_create(void *parent, const struct win ...@@ -201,6 +204,8 @@ HRESULT CDECL wined3d_shader_resource_view_create(void *parent, const struct win
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
object->refcount = 1; object->refcount = 1;
object->resource = resource;
wined3d_resource_incref(resource);
object->parent = parent; object->parent = parent;
object->parent_ops = parent_ops; object->parent_ops = parent_ops;
......
...@@ -2663,6 +2663,7 @@ struct wined3d_shader_resource_view ...@@ -2663,6 +2663,7 @@ struct wined3d_shader_resource_view
{ {
LONG refcount; LONG refcount;
struct wined3d_resource *resource;
void *parent; void *parent;
const struct wined3d_parent_ops *parent_ops; const struct wined3d_parent_ops *parent_ops;
}; };
......
...@@ -2441,8 +2441,8 @@ ULONG __cdecl wined3d_shader_incref(struct wined3d_shader *shader); ...@@ -2441,8 +2441,8 @@ ULONG __cdecl wined3d_shader_incref(struct wined3d_shader *shader);
HRESULT __cdecl wined3d_shader_set_local_constants_float(struct wined3d_shader *shader, HRESULT __cdecl wined3d_shader_set_local_constants_float(struct wined3d_shader *shader,
UINT start_idx, const float *src_data, UINT vector4f_count); UINT start_idx, const float *src_data, UINT vector4f_count);
HRESULT __cdecl wined3d_shader_resource_view_create(void *parent, const struct wined3d_parent_ops *parent_ops, HRESULT __cdecl wined3d_shader_resource_view_create(struct wined3d_resource *resource, void *parent,
struct wined3d_shader_resource_view **view); const struct wined3d_parent_ops *parent_ops, struct wined3d_shader_resource_view **view);
ULONG __cdecl wined3d_shader_resource_view_decref(struct wined3d_shader_resource_view *view); ULONG __cdecl wined3d_shader_resource_view_decref(struct wined3d_shader_resource_view *view);
void * __cdecl wined3d_shader_resource_view_get_parent(const struct wined3d_shader_resource_view *view); void * __cdecl wined3d_shader_resource_view_get_parent(const struct wined3d_shader_resource_view *view);
ULONG __cdecl wined3d_shader_resource_view_incref(struct wined3d_shader_resource_view *view); ULONG __cdecl wined3d_shader_resource_view_incref(struct wined3d_shader_resource_view *view);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment