Commit 9a6d889b authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

d3d8: Create sub-resource surfaces manually.

parent e0828a70
...@@ -202,8 +202,8 @@ struct d3d8_surface ...@@ -202,8 +202,8 @@ struct d3d8_surface
}; };
struct wined3d_rendertarget_view *d3d8_surface_acquire_rendertarget_view(struct d3d8_surface *surface) DECLSPEC_HIDDEN; struct wined3d_rendertarget_view *d3d8_surface_acquire_rendertarget_view(struct d3d8_surface *surface) DECLSPEC_HIDDEN;
struct d3d8_surface *d3d8_surface_create(struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, struct d3d8_surface *d3d8_surface_create(struct wined3d_texture *wined3d_texture,
const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
struct d3d8_device *d3d8_surface_get_device(const struct d3d8_surface *surface) DECLSPEC_HIDDEN; struct d3d8_device *d3d8_surface_get_device(const struct d3d8_surface *surface) DECLSPEC_HIDDEN;
void d3d8_surface_release_rendertarget_view(struct d3d8_surface *surface, void d3d8_surface_release_rendertarget_view(struct d3d8_surface *surface,
struct wined3d_rendertarget_view *rtv) DECLSPEC_HIDDEN; struct wined3d_rendertarget_view *rtv) DECLSPEC_HIDDEN;
......
...@@ -930,7 +930,7 @@ static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource) ...@@ -930,7 +930,7 @@ static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource)
} }
surface = wined3d_texture_get_sub_resource_parent(wined3d_texture_from_resource(resource), 0); surface = wined3d_texture_get_sub_resource_parent(wined3d_texture_from_resource(resource), 0);
if (!surface->resource.refcount) if (!surface || !surface->resource.refcount)
return D3D_OK; return D3D_OK;
WARN("Surface %p in pool D3DPOOL_DEFAULT blocks the Reset call.\n", surface); WARN("Surface %p in pool D3DPOOL_DEFAULT blocks the Reset call.\n", surface);
...@@ -973,6 +973,8 @@ static HRESULT WINAPI d3d8_device_Reset(IDirect3DDevice8 *iface, ...@@ -973,6 +973,8 @@ static HRESULT WINAPI d3d8_device_Reset(IDirect3DDevice8 *iface,
if (SUCCEEDED(hr = wined3d_device_reset(device->wined3d_device, &swapchain_desc, if (SUCCEEDED(hr = wined3d_device_reset(device->wined3d_device, &swapchain_desc,
NULL, reset_enum_callback, TRUE))) NULL, reset_enum_callback, TRUE)))
{ {
struct wined3d_rendertarget_view *rtv;
present_parameters->BackBufferCount = swapchain_desc.backbuffer_count; present_parameters->BackBufferCount = swapchain_desc.backbuffer_count;
implicit_swapchain = wined3d_swapchain_get_parent(device->implicit_swapchain); implicit_swapchain = wined3d_swapchain_get_parent(device->implicit_swapchain);
implicit_swapchain->swap_interval implicit_swapchain->swap_interval
...@@ -981,6 +983,16 @@ static HRESULT WINAPI d3d8_device_Reset(IDirect3DDevice8 *iface, ...@@ -981,6 +983,16 @@ static HRESULT WINAPI d3d8_device_Reset(IDirect3DDevice8 *iface,
wined3d_stateblock_set_render_state(device->state, WINED3D_RS_ZENABLE, wined3d_stateblock_set_render_state(device->state, WINED3D_RS_ZENABLE,
!!swapchain_desc.enable_auto_depth_stencil); !!swapchain_desc.enable_auto_depth_stencil);
device_reset_viewport_state(device); device_reset_viewport_state(device);
if ((rtv = wined3d_device_context_get_depth_stencil_view(device->immediate_context)))
{
struct wined3d_resource *resource = wined3d_rendertarget_view_get_resource(rtv);
struct d3d8_surface *surface;
if ((surface = d3d8_surface_create(wined3d_texture_from_resource(resource), 0)))
surface->parent_device = &device->IDirect3DDevice8_iface;
}
device->device_state = D3D8_DEVICE_STATE_OK; device->device_state = D3D8_DEVICE_STATE_OK;
} }
else else
...@@ -1085,6 +1097,7 @@ static HRESULT WINAPI d3d8_device_CreateTexture(IDirect3DDevice8 *iface, ...@@ -1085,6 +1097,7 @@ static HRESULT WINAPI d3d8_device_CreateTexture(IDirect3DDevice8 *iface,
{ {
struct d3d8_device *device = impl_from_IDirect3DDevice8(iface); struct d3d8_device *device = impl_from_IDirect3DDevice8(iface);
struct d3d8_texture *object; struct d3d8_texture *object;
unsigned int i;
HRESULT hr; HRESULT hr;
TRACE("iface %p, width %u, height %u, levels %u, usage %#lx, format %#x, pool %#x, texture %p.\n", TRACE("iface %p, width %u, height %u, levels %u, usage %#lx, format %#x, pool %#x, texture %p.\n",
...@@ -1105,6 +1118,16 @@ static HRESULT WINAPI d3d8_device_CreateTexture(IDirect3DDevice8 *iface, ...@@ -1105,6 +1118,16 @@ static HRESULT WINAPI d3d8_device_CreateTexture(IDirect3DDevice8 *iface,
return hr; return hr;
} }
levels = wined3d_texture_get_level_count(object->wined3d_texture);
for (i = 0; i < levels; ++i)
{
if (!d3d8_surface_create(object->wined3d_texture, i))
{
IDirect3DTexture8_Release(&object->IDirect3DBaseTexture8_iface);
return E_OUTOFMEMORY;
}
}
TRACE("Created texture %p.\n", object); TRACE("Created texture %p.\n", object);
*texture = (IDirect3DTexture8 *)&object->IDirect3DBaseTexture8_iface; *texture = (IDirect3DTexture8 *)&object->IDirect3DBaseTexture8_iface;
...@@ -1148,6 +1171,7 @@ static HRESULT WINAPI d3d8_device_CreateCubeTexture(IDirect3DDevice8 *iface, UIN ...@@ -1148,6 +1171,7 @@ static HRESULT WINAPI d3d8_device_CreateCubeTexture(IDirect3DDevice8 *iface, UIN
{ {
struct d3d8_device *device = impl_from_IDirect3DDevice8(iface); struct d3d8_device *device = impl_from_IDirect3DDevice8(iface);
struct d3d8_texture *object; struct d3d8_texture *object;
unsigned int i;
HRESULT hr; HRESULT hr;
TRACE("iface %p, edge_length %u, levels %u, usage %#lx, format %#x, pool %#x, texture %p.\n", TRACE("iface %p, edge_length %u, levels %u, usage %#lx, format %#x, pool %#x, texture %p.\n",
...@@ -1168,6 +1192,16 @@ static HRESULT WINAPI d3d8_device_CreateCubeTexture(IDirect3DDevice8 *iface, UIN ...@@ -1168,6 +1192,16 @@ static HRESULT WINAPI d3d8_device_CreateCubeTexture(IDirect3DDevice8 *iface, UIN
return hr; return hr;
} }
levels = wined3d_texture_get_level_count(object->wined3d_texture);
for (i = 0; i < levels * 6; ++i)
{
if (!d3d8_surface_create(object->wined3d_texture, i))
{
IDirect3DTexture8_Release(&object->IDirect3DBaseTexture8_iface);
return E_OUTOFMEMORY;
}
}
TRACE("Created cube texture %p.\n", object); TRACE("Created cube texture %p.\n", object);
*texture = (IDirect3DCubeTexture8 *)&object->IDirect3DBaseTexture8_iface; *texture = (IDirect3DCubeTexture8 *)&object->IDirect3DBaseTexture8_iface;
...@@ -1263,7 +1297,12 @@ static HRESULT d3d8_device_create_surface(struct d3d8_device *device, enum wined ...@@ -1263,7 +1297,12 @@ static HRESULT d3d8_device_create_surface(struct d3d8_device *device, enum wined
return hr; return hr;
} }
surface_impl = wined3d_texture_get_sub_resource_parent(texture, 0); if (!(surface_impl = d3d8_surface_create(texture, 0)))
{
wined3d_texture_decref(texture);
wined3d_mutex_unlock();
return E_OUTOFMEMORY;
}
surface_impl->parent_device = &device->IDirect3DDevice8_iface; surface_impl->parent_device = &device->IDirect3DDevice8_iface;
*surface = &surface_impl->IDirect3DSurface8_iface; *surface = &surface_impl->IDirect3DSurface8_iface;
IDirect3DSurface8_AddRef(*surface); IDirect3DSurface8_AddRef(*surface);
...@@ -3564,16 +3603,7 @@ static HRESULT CDECL device_parent_texture_sub_resource_created(struct wined3d_d ...@@ -3564,16 +3603,7 @@ static HRESULT CDECL device_parent_texture_sub_resource_created(struct wined3d_d
TRACE("device_parent %p, type %#x, wined3d_texture %p, sub_resource_idx %u, parent %p, parent_ops %p.\n", TRACE("device_parent %p, type %#x, wined3d_texture %p, sub_resource_idx %u, parent %p, parent_ops %p.\n",
device_parent, type, wined3d_texture, sub_resource_idx, parent, parent_ops); device_parent, type, wined3d_texture, sub_resource_idx, parent, parent_ops);
if (type == WINED3D_RTYPE_TEXTURE_2D) if (type == WINED3D_RTYPE_TEXTURE_3D)
{
struct d3d8_surface *d3d_surface;
if (!(d3d_surface = d3d8_surface_create(wined3d_texture, sub_resource_idx, parent_ops)))
return E_OUTOFMEMORY;
*parent = d3d_surface;
}
else if (type == WINED3D_RTYPE_TEXTURE_3D)
{ {
struct d3d8_volume *d3d_volume; struct d3d8_volume *d3d_volume;
...@@ -3584,7 +3614,7 @@ static HRESULT CDECL device_parent_texture_sub_resource_created(struct wined3d_d ...@@ -3584,7 +3614,7 @@ static HRESULT CDECL device_parent_texture_sub_resource_created(struct wined3d_d
*parent = d3d_volume; *parent = d3d_volume;
TRACE("Created volume %p.\n", d3d_volume); TRACE("Created volume %p.\n", d3d_volume);
} }
else else if (type != WINED3D_RTYPE_TEXTURE_2D)
{ {
ERR("Unhandled resource type %#x.\n", type); ERR("Unhandled resource type %#x.\n", type);
return E_FAIL; return E_FAIL;
...@@ -3598,7 +3628,6 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic ...@@ -3598,7 +3628,6 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic
struct wined3d_texture **texture) struct wined3d_texture **texture)
{ {
struct d3d8_device *device = device_from_device_parent(device_parent); struct d3d8_device *device = device_from_device_parent(device_parent);
struct d3d8_surface *d3d_surface;
HRESULT hr; HRESULT hr;
TRACE("device_parent %p, container_parent %p, desc %p, texture flags %#lx, texture %p.\n", TRACE("device_parent %p, container_parent %p, desc %p, texture flags %#lx, texture %p.\n",
...@@ -3611,9 +3640,6 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic ...@@ -3611,9 +3640,6 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic
return hr; return hr;
} }
d3d_surface = wined3d_texture_get_sub_resource_parent(*texture, 0);
d3d_surface->parent_device = &device->IDirect3DDevice8_iface;
return hr; return hr;
} }
......
...@@ -309,8 +309,7 @@ static const struct wined3d_parent_ops d3d8_surface_wined3d_parent_ops = ...@@ -309,8 +309,7 @@ static const struct wined3d_parent_ops d3d8_surface_wined3d_parent_ops =
surface_wined3d_object_destroyed, surface_wined3d_object_destroyed,
}; };
struct d3d8_surface *d3d8_surface_create(struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, struct d3d8_surface *d3d8_surface_create(struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx)
const struct wined3d_parent_ops **parent_ops)
{ {
IDirect3DBaseTexture8 *texture; IDirect3DBaseTexture8 *texture;
struct d3d8_surface *surface; struct d3d8_surface *surface;
...@@ -333,7 +332,8 @@ struct d3d8_surface *d3d8_surface_create(struct wined3d_texture *wined3d_texture ...@@ -333,7 +332,8 @@ struct d3d8_surface *d3d8_surface_create(struct wined3d_texture *wined3d_texture
IDirect3DBaseTexture8_Release(texture); IDirect3DBaseTexture8_Release(texture);
} }
*parent_ops = &d3d8_surface_wined3d_parent_ops; wined3d_texture_set_sub_resource_parent(wined3d_texture, sub_resource_idx,
surface, &d3d8_surface_wined3d_parent_ops);
TRACE("Created surface %p.\n", surface); TRACE("Created surface %p.\n", surface);
return surface; return surface;
......
...@@ -193,7 +193,10 @@ static HRESULT swapchain_init(struct d3d8_swapchain *swapchain, struct d3d8_devi ...@@ -193,7 +193,10 @@ static HRESULT swapchain_init(struct d3d8_swapchain *swapchain, struct d3d8_devi
HRESULT d3d8_swapchain_create(struct d3d8_device *device, struct wined3d_swapchain_desc *desc, HRESULT d3d8_swapchain_create(struct d3d8_device *device, struct wined3d_swapchain_desc *desc,
unsigned int swap_interval, struct d3d8_swapchain **swapchain) unsigned int swap_interval, struct d3d8_swapchain **swapchain)
{ {
struct wined3d_rendertarget_view *wined3d_dsv;
struct d3d8_swapchain *object; struct d3d8_swapchain *object;
struct d3d8_surface *surface;
unsigned int i;
HRESULT hr; HRESULT hr;
if (!(object = heap_alloc_zero(sizeof(*object)))) if (!(object = heap_alloc_zero(sizeof(*object))))
...@@ -206,6 +209,29 @@ HRESULT d3d8_swapchain_create(struct d3d8_device *device, struct wined3d_swapcha ...@@ -206,6 +209,29 @@ HRESULT d3d8_swapchain_create(struct d3d8_device *device, struct wined3d_swapcha
return hr; return hr;
} }
for (i = 0; i < desc->backbuffer_count; ++i)
{
if (!(surface = d3d8_surface_create(wined3d_swapchain_get_back_buffer(object->wined3d_swapchain, i), 0)))
{
IDirect3DSwapChain8_Release(&object->IDirect3DSwapChain8_iface);
return E_OUTOFMEMORY;
}
surface->parent_device = &device->IDirect3DDevice8_iface;
}
if ((desc->flags & WINED3D_SWAPCHAIN_IMPLICIT)
&& (wined3d_dsv = wined3d_device_context_get_depth_stencil_view(device->immediate_context)))
{
struct wined3d_resource *resource = wined3d_rendertarget_view_get_resource(wined3d_dsv);
if (!(surface = d3d8_surface_create(wined3d_texture_from_resource(resource), 0)))
{
IDirect3DSwapChain8_Release(&object->IDirect3DSwapChain8_iface);
return E_OUTOFMEMORY;
}
surface->parent_device = &device->IDirect3DDevice8_iface;
}
TRACE("Created swapchain %p.\n", object); TRACE("Created swapchain %p.\n", object);
*swapchain = object; *swapchain = object;
......
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