wined3d: Set the surface container in surface_init().

This commit is contained in:
Henri Verbeet 2013-11-15 08:24:33 +01:00 committed by Alexandre Julliard
parent bb00811d60
commit 42f6ca821c
4 changed files with 19 additions and 28 deletions

View File

@ -484,8 +484,7 @@ static void ddraw_surface_cleanup(struct ddraw_surface *surface)
surface, surface->ref7, surface->ref4, surface->ref3, surface->ref2, surface->ref1);
}
if (surface->wined3d_texture
&& !(surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_TEXTURE))
if (surface->wined3d_texture)
wined3d_texture_decref(surface->wined3d_texture);
if (surface->wined3d_surface)
wined3d_surface_decref(surface->wined3d_surface);
@ -508,11 +507,7 @@ ULONG ddraw_surface_release_iface(struct ddraw_surface *This)
wined3d_mutex_unlock();
return iface_count;
}
/* If it's a texture, destroy the wined3d texture. */
if (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_TEXTURE)
wined3d_texture_decref(This->wined3d_texture);
else
ddraw_surface_cleanup(This);
ddraw_surface_cleanup(This);
wined3d_mutex_unlock();
if (release_iface)
@ -5579,12 +5574,8 @@ static const struct wined3d_parent_ops ddraw_surface_wined3d_parent_ops =
static void STDMETHODCALLTYPE ddraw_texture_wined3d_object_destroyed(void *parent)
{
struct ddraw_texture *texture = parent;
TRACE("parent %p.\n", parent);
TRACE("texture %p.\n", texture);
if (texture->surface_desc.ddsCaps.dwCaps & DDSCAPS_TEXTURE)
ddraw_surface_cleanup(texture->root);
HeapFree(GetProcessHeap(), 0, parent);
}

View File

@ -6766,9 +6766,10 @@ cpu:
return surface_cpu_blt(dst_surface, &dst_rect, src_surface, &src_rect, flags, fx, filter);
}
static HRESULT surface_init(struct wined3d_surface *surface, const struct wined3d_resource_desc *desc,
struct wined3d_device *device, DWORD flags)
static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_texture *container,
const struct wined3d_resource_desc *desc, DWORD flags)
{
struct wined3d_device *device = container->resource.device;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const struct wined3d_format *format = wined3d_get_format(gl_info, desc->format);
UINT multisample_quality = desc->multisample_quality;
@ -6830,9 +6831,7 @@ static HRESULT surface_init(struct wined3d_surface *surface, const struct wined3
return hr;
}
/* "Standalone" surface. */
surface_set_container(surface, NULL);
surface_set_container(surface, container);
list_init(&surface->overlays);
/* Flags */
@ -6866,6 +6865,7 @@ static HRESULT surface_init(struct wined3d_surface *surface, const struct wined3
if (FAILED(hr))
{
ERR("Private setup failed, returning %#x\n", hr);
surface_set_container(surface, NULL);
surface_cleanup(surface);
return hr;
}
@ -6883,34 +6883,36 @@ static HRESULT surface_init(struct wined3d_surface *surface, const struct wined3
return hr;
}
HRESULT CDECL wined3d_surface_create(struct wined3d_device *device, void *container_parent,
HRESULT CDECL wined3d_surface_create(struct wined3d_texture *container,
const struct wined3d_resource_desc *desc, DWORD flags, struct wined3d_surface **surface)
{
struct wined3d_device_parent *device_parent = container->resource.device->device_parent;
const struct wined3d_parent_ops *parent_ops;
struct wined3d_surface *object;
void *parent;
HRESULT hr;
TRACE("device %p, container_parent %p, width %u, height %u, format %s, usage %s (%#x), "
TRACE("container %p, width %u, height %u, format %s, usage %s (%#x), "
"pool %s, multisample_type %#x, multisample_quality %u, flags %#x, surface %p.\n",
device, container_parent, desc->width, desc->height, debug_d3dformat(desc->format),
container, desc->width, desc->height, debug_d3dformat(desc->format),
debug_d3dusage(desc->usage), desc->usage, debug_d3dpool(desc->pool),
desc->multisample_type, desc->multisample_quality, flags, surface);
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
return E_OUTOFMEMORY;
if (FAILED(hr = surface_init(object, desc, device, flags)))
if (FAILED(hr = surface_init(object, container, desc, flags)))
{
WARN("Failed to initialize surface, returning %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, object);
return hr;
}
if (FAILED(hr = device->device_parent->ops->surface_created(device->device_parent,
container_parent, object, &parent, &parent_ops)))
if (FAILED(hr = device_parent->ops->surface_created(device_parent,
wined3d_texture_get_parent(container), object, &parent, &parent_ops)))
{
WARN("Failed to create surface parent, hr %#x.\n", hr);
surface_set_container(object, NULL);
wined3d_surface_decref(object);
return hr;
}

View File

@ -860,14 +860,13 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wi
UINT idx = j * texture->level_count + i;
struct wined3d_surface *surface;
if (FAILED(hr = wined3d_surface_create(device, parent, &surface_desc, surface_flags, &surface)))
if (FAILED(hr = wined3d_surface_create(texture, &surface_desc, surface_flags, &surface)))
{
WARN("Failed to create surface, hr %#x.\n", hr);
wined3d_texture_cleanup(texture);
return hr;
}
surface_set_container(surface, texture);
surface_set_texture_target(surface, cube_targets[j], i);
texture->sub_resources[idx] = &surface->resource;
TRACE("Created surface level %u @ %p.\n", i, surface);
@ -1015,14 +1014,13 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
{
struct wined3d_surface *surface;
if (FAILED(hr = wined3d_surface_create(device, parent, &surface_desc, surface_flags, &surface)))
if (FAILED(hr = wined3d_surface_create(texture, &surface_desc, surface_flags, &surface)))
{
WARN("Failed to create surface, hr %#x.\n", hr);
wined3d_texture_cleanup(texture);
return hr;
}
surface_set_container(surface, texture);
surface_set_texture_target(surface, texture->target, i);
texture->sub_resources[i] = &surface->resource;
TRACE("Created surface level %u @ %p.\n", i, surface);

View File

@ -2273,7 +2273,7 @@ void surface_update_draw_binding(struct wined3d_surface *surface) DECLSPEC_HIDDE
HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point,
struct wined3d_surface *src_surface, const RECT *src_rect) DECLSPEC_HIDDEN;
void surface_validate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN;
HRESULT CDECL wined3d_surface_create(struct wined3d_device *device, void *container_parent,
HRESULT CDECL wined3d_surface_create(struct wined3d_texture *container,
const struct wined3d_resource_desc *desc, DWORD flags, struct wined3d_surface **surface) DECLSPEC_HIDDEN;
void get_drawable_size_swapchain(const struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;