2 * Copyright 2009, 2011 Henri Verbeet for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/port.h"
23 #include "wined3d_private.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d
);
27 ULONG CDECL
wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view
*view
)
29 ULONG refcount
= InterlockedIncrement(&view
->refcount
);
31 TRACE("%p increasing refcount to %u.\n", view
, refcount
);
36 ULONG CDECL
wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view
*view
)
38 ULONG refcount
= InterlockedDecrement(&view
->refcount
);
40 TRACE("%p decreasing refcount to %u.\n", view
, refcount
);
44 /* Call wined3d_object_destroyed() before releasing the resource,
45 * since releasing the resource may end up destroying the parent. */
46 view
->parent_ops
->wined3d_object_destroyed(view
->parent
);
47 wined3d_resource_decref(view
->resource
);
48 HeapFree(GetProcessHeap(), 0, view
);
54 void * CDECL
wined3d_rendertarget_view_get_parent(const struct wined3d_rendertarget_view
*view
)
56 TRACE("view %p.\n", view
);
61 void * CDECL
wined3d_rendertarget_view_get_sub_resource_parent(const struct wined3d_rendertarget_view
*view
)
63 struct wined3d_texture
*texture
;
65 TRACE("view %p.\n", view
);
67 if (view
->resource
->type
== WINED3D_RTYPE_BUFFER
)
68 return wined3d_buffer_get_parent(buffer_from_resource(view
->resource
));
70 texture
= wined3d_texture_from_resource(view
->resource
);
72 return wined3d_resource_get_parent(texture
->sub_resources
[view
->sub_resource_idx
].resource
);
75 void CDECL
wined3d_rendertarget_view_set_parent(struct wined3d_rendertarget_view
*view
, void *parent
)
77 TRACE("view %p, parent %p.\n", view
, parent
);
79 view
->parent
= parent
;
82 struct wined3d_resource
* CDECL
wined3d_rendertarget_view_get_resource(const struct wined3d_rendertarget_view
*view
)
84 TRACE("view %p.\n", view
);
86 return view
->resource
;
89 static HRESULT
wined3d_rendertarget_view_init(struct wined3d_rendertarget_view
*view
,
90 const struct wined3d_rendertarget_view_desc
*desc
, struct wined3d_resource
*resource
,
91 void *parent
, const struct wined3d_parent_ops
*parent_ops
)
93 const struct wined3d_gl_info
*gl_info
= &resource
->device
->adapter
->gl_info
;
96 view
->parent
= parent
;
97 view
->parent_ops
= parent_ops
;
99 view
->format
= wined3d_get_format(gl_info
, desc
->format_id
);
100 view
->format_flags
= view
->format
->flags
[resource
->gl_type
];
101 if (resource
->type
== WINED3D_RTYPE_BUFFER
)
103 view
->sub_resource_idx
= 0;
104 view
->buffer_offset
= desc
->u
.buffer
.start_idx
;
105 view
->width
= desc
->u
.buffer
.count
;
111 struct wined3d_texture
*texture
= wined3d_texture_from_resource(resource
);
113 if (desc
->u
.texture
.level_idx
>= texture
->level_count
114 || desc
->u
.texture
.layer_idx
>= texture
->layer_count
115 || desc
->u
.texture
.layer_count
> texture
->layer_count
- desc
->u
.texture
.layer_idx
)
116 return WINED3DERR_INVALIDCALL
;
117 view
->sub_resource_idx
= desc
->u
.texture
.layer_idx
* texture
->level_count
+ desc
->u
.texture
.level_idx
;
118 view
->buffer_offset
= 0;
119 view
->width
= wined3d_texture_get_level_width(texture
, desc
->u
.texture
.level_idx
);
120 view
->height
= wined3d_texture_get_level_height(texture
, desc
->u
.texture
.level_idx
);
121 view
->depth
= desc
->u
.texture
.layer_count
;
123 wined3d_resource_incref(view
->resource
= resource
);
128 HRESULT CDECL
wined3d_rendertarget_view_create(const struct wined3d_rendertarget_view_desc
*desc
,
129 struct wined3d_resource
*resource
, void *parent
, const struct wined3d_parent_ops
*parent_ops
,
130 struct wined3d_rendertarget_view
**view
)
132 struct wined3d_rendertarget_view
*object
;
135 TRACE("desc %p, resource %p, parent %p, parent_ops %p, view %p.\n",
136 desc
, resource
, parent
, parent_ops
, view
);
138 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
139 return E_OUTOFMEMORY
;
141 if (FAILED(hr
= wined3d_rendertarget_view_init(object
, desc
, resource
, parent
, parent_ops
)))
143 HeapFree(GetProcessHeap(), 0, object
);
144 WARN("Failed to initialise view, hr %#x.\n", hr
);
148 TRACE("Created render target view %p.\n", object
);
154 HRESULT CDECL
wined3d_rendertarget_view_create_from_sub_resource(struct wined3d_texture
*texture
,
155 unsigned int sub_resource_idx
, void *parent
, const struct wined3d_parent_ops
*parent_ops
,
156 struct wined3d_rendertarget_view
**view
)
158 struct wined3d_rendertarget_view_desc desc
;
160 TRACE("texture %p, sub_resource_idx %u, parent %p, parent_ops %p, view %p.\n",
161 texture
, sub_resource_idx
, parent
, parent_ops
, view
);
163 desc
.format_id
= texture
->resource
.format
->id
;
164 desc
.u
.texture
.level_idx
= sub_resource_idx
% texture
->level_count
;
165 desc
.u
.texture
.layer_idx
= sub_resource_idx
/ texture
->level_count
;
166 desc
.u
.texture
.layer_count
= 1;
168 return wined3d_rendertarget_view_create(&desc
, &texture
->resource
, parent
, parent_ops
, view
);
171 ULONG CDECL
wined3d_shader_resource_view_incref(struct wined3d_shader_resource_view
*view
)
173 ULONG refcount
= InterlockedIncrement(&view
->refcount
);
175 TRACE("%p increasing refcount to %u.\n", view
, refcount
);
180 ULONG CDECL
wined3d_shader_resource_view_decref(struct wined3d_shader_resource_view
*view
)
182 ULONG refcount
= InterlockedDecrement(&view
->refcount
);
184 TRACE("%p decreasing refcount to %u.\n", view
, refcount
);
188 /* Call wined3d_object_destroyed() before releasing the resource,
189 * since releasing the resource may end up destroying the parent. */
190 view
->parent_ops
->wined3d_object_destroyed(view
->parent
);
191 wined3d_resource_decref(view
->resource
);
192 HeapFree(GetProcessHeap(), 0, view
);
198 void * CDECL
wined3d_shader_resource_view_get_parent(const struct wined3d_shader_resource_view
*view
)
200 TRACE("view %p.\n", view
);
205 HRESULT CDECL
wined3d_shader_resource_view_create(struct wined3d_resource
*resource
, void *parent
,
206 const struct wined3d_parent_ops
*parent_ops
, struct wined3d_shader_resource_view
**view
)
208 struct wined3d_shader_resource_view
*object
;
210 TRACE("resource %p, parent %p, parent_ops %p, view %p.\n", resource
, parent
, parent_ops
, view
);
212 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
213 return E_OUTOFMEMORY
;
215 object
->refcount
= 1;
216 object
->resource
= resource
;
217 wined3d_resource_incref(resource
);
218 object
->parent
= parent
;
219 object
->parent_ops
= parent_ops
;
221 TRACE("Created shader resource view %p.\n", object
);