[PATCH 2/5] wined3d: Add a flags parameter to wined3d_surface_create().
Henri Verbeet
hverbeet at codeweavers.com
Tue Nov 29 23:01:45 CST 2011
---
dlls/d3d10core/texture.c | 4 ++--
dlls/d3d8/surface.c | 10 ++++++++--
dlls/d3d9/surface.c | 10 ++++++++--
dlls/ddraw/ddraw.c | 8 ++++++--
dlls/ddraw/surface.c | 7 +++----
dlls/wined3d/device.c | 6 +++---
dlls/wined3d/surface.c | 28 +++++++++++++++-------------
include/wine/wined3d.h | 7 +++++--
8 files changed, 50 insertions(+), 30 deletions(-)
diff --git a/dlls/d3d10core/texture.c b/dlls/d3d10core/texture.c
index 32bcde2..bd9b63a 100644
--- a/dlls/d3d10core/texture.c
+++ b/dlls/d3d10core/texture.c
@@ -237,9 +237,9 @@ HRESULT d3d10_texture2d_init(struct d3d10_texture2d *texture, struct d3d10_devic
FIXME("Implement DXGI<->wined3d usage conversion\n");
hr = wined3d_surface_create(device->wined3d_device, desc->Width, desc->Height,
- wined3dformat_from_dxgi_format(desc->Format), FALSE, FALSE, 0, desc->Usage, WINED3DPOOL_DEFAULT,
+ wined3dformat_from_dxgi_format(desc->Format), 0, desc->Usage, WINED3DPOOL_DEFAULT,
desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3DMULTISAMPLE_NONE,
- desc->SampleDesc.Quality, SURFACE_OPENGL, texture, &d3d10_texture2d_wined3d_parent_ops,
+ desc->SampleDesc.Quality, SURFACE_OPENGL, 0, texture, &d3d10_texture2d_wined3d_parent_ops,
&texture->wined3d_surface);
if (FAILED(hr))
{
diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c
index 23e5036..1bcd9bb 100644
--- a/dlls/d3d8/surface.c
+++ b/dlls/d3d8/surface.c
@@ -318,6 +318,7 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level,
DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality)
{
+ DWORD flags = 0;
HRESULT hr;
surface->IDirect3DSurface8_iface.lpVtbl = &Direct3DSurface8_Vtbl;
@@ -330,10 +331,15 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
multisample_quality = 0;
}
+ if (lockable)
+ flags |= WINED3D_SURFACE_MAPPABLE;
+ if (discard)
+ flags |= WINED3D_SURFACE_DISCARD;
+
wined3d_mutex_lock();
hr = wined3d_surface_create(device->wined3d_device, width, height, wined3dformat_from_d3dformat(format),
- lockable, discard, level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type,
- multisample_quality, SURFACE_OPENGL, surface, &d3d8_surface_wined3d_parent_ops, &surface->wined3d_surface);
+ level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type, multisample_quality,
+ SURFACE_OPENGL, flags, surface, &d3d8_surface_wined3d_parent_ops, &surface->wined3d_surface);
wined3d_mutex_unlock();
if (FAILED(hr))
{
diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c
index 126b947..5bae929 100644
--- a/dlls/d3d9/surface.c
+++ b/dlls/d3d9/surface.c
@@ -395,6 +395,7 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic
UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level,
DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality)
{
+ DWORD flags = 0;
HRESULT hr;
surface->IDirect3DSurface9_iface.lpVtbl = &Direct3DSurface9_Vtbl;
@@ -423,10 +424,15 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic
multisample_quality = 0;
}
+ if (lockable)
+ flags |= WINED3D_SURFACE_MAPPABLE;
+ if (discard)
+ flags |= WINED3D_SURFACE_DISCARD;
+
wined3d_mutex_lock();
hr = wined3d_surface_create(device->wined3d_device, width, height, wined3dformat_from_d3dformat(format),
- lockable, discard, level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type,
- multisample_quality, SURFACE_OPENGL, surface, &d3d9_surface_wined3d_parent_ops, &surface->wined3d_surface);
+ level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type, multisample_quality,
+ SURFACE_OPENGL, flags, surface, &d3d9_surface_wined3d_parent_ops, &surface->wined3d_surface);
wined3d_mutex_unlock();
if (FAILED(hr))
{
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 098165a..2d1e59b 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -5384,6 +5384,7 @@ static HRESULT CDECL device_parent_create_rendertarget(struct wined3d_device_par
struct wined3d_surface **surface)
{
struct IDirectDrawImpl *ddraw = ddraw_from_device_parent(device_parent);
+ DWORD flags = 0;
HRESULT hr;
TRACE("device_parent %p, container_parent %p, width %u, height %u, format %#x, multisample_type %#x,\n"
@@ -5397,9 +5398,12 @@ static HRESULT CDECL device_parent_create_rendertarget(struct wined3d_device_par
return E_FAIL;
}
- hr = wined3d_surface_create(ddraw->wined3d_device, width, height, format, lockable, FALSE, 0,
+ if (lockable)
+ flags |= WINED3D_SURFACE_MAPPABLE;
+
+ hr = wined3d_surface_create(ddraw->wined3d_device, width, height, format, 0,
WINED3DUSAGE_RENDERTARGET, WINED3DPOOL_DEFAULT, multisample_type, multisample_quality,
- DefaultSurfaceType, ddraw, &ddraw_frontbuffer_parent_ops, surface);
+ DefaultSurfaceType, flags, ddraw, &ddraw_frontbuffer_parent_ops, surface);
if (SUCCEEDED(hr))
ddraw->wined3d_frontbuffer = *surface;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 851920c..05d9b2b 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -5342,10 +5342,9 @@ HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddr
surface->first_attached = surface;
- hr = wined3d_surface_create(ddraw->wined3d_device, desc->dwWidth, desc->dwHeight, format,
- TRUE /* Lockable */, FALSE /* Discard */, mip_level, usage, pool,
- WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, DefaultSurfaceType, surface,
- &ddraw_surface_wined3d_parent_ops, &surface->wined3d_surface);
+ hr = wined3d_surface_create(ddraw->wined3d_device, desc->dwWidth, desc->dwHeight, format, mip_level,
+ usage, pool, WINED3DMULTISAMPLE_NONE, 0, DefaultSurfaceType, WINED3D_SURFACE_MAPPABLE,
+ surface, &ddraw_surface_wined3d_parent_ops, &surface->wined3d_surface);
if (FAILED(hr))
{
WARN("Failed to create wined3d surface, hr %#x.\n", hr);
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 4c585d4..aca9306 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -934,9 +934,9 @@ static void device_load_logo(struct wined3d_device *device, const char *filename
bm.bmHeight = 32;
}
- hr = wined3d_surface_create(device, bm.bmWidth, bm.bmHeight, WINED3DFMT_B5G6R5_UNORM, TRUE,
- FALSE, 0, 0, WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, NULL,
- &wined3d_null_parent_ops, &device->logo_surface);
+ hr = wined3d_surface_create(device, bm.bmWidth, bm.bmHeight, WINED3DFMT_B5G6R5_UNORM, 0, 0,
+ WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, WINED3D_SURFACE_MAPPABLE,
+ NULL, &wined3d_null_parent_ops, &device->logo_surface);
if (FAILED(hr))
{
ERR("Wine logo requested, but failed to create surface, hr %#x.\n", hr);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 4c9cc84..4110345 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -3569,9 +3569,10 @@ static struct wined3d_surface *surface_convert_format(struct wined3d_surface *so
}
wined3d_surface_create(source->resource.device, source->resource.width,
- source->resource.height, to_fmt, TRUE /* lockable */, TRUE /* discard */, 0 /* level */,
- 0 /* usage */, WINED3DPOOL_SCRATCH, WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */,
- 0 /* MultiSampleQuality */, source->surface_type, NULL /* parent */, &wined3d_null_parent_ops, &ret);
+ source->resource.height, to_fmt, 0 /* level */, 0 /* usage */, WINED3DPOOL_SCRATCH,
+ WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */, 0 /* MultiSampleQuality */,
+ source->surface_type, WINED3D_SURFACE_MAPPABLE | WINED3D_SURFACE_DISCARD,
+ NULL /* parent */, &wined3d_null_parent_ops, &ret);
if (!ret)
{
ERR("Failed to create a destination surface for conversion.\n");
@@ -7089,12 +7090,13 @@ const struct blit_shader cpu_blit = {
};
static HRESULT surface_init(struct wined3d_surface *surface, WINED3DSURFTYPE surface_type, UINT alignment,
- UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
+ UINT width, UINT height, UINT level, WINED3DMULTISAMPLE_TYPE multisample_type,
UINT multisample_quality, struct wined3d_device *device, DWORD usage, enum wined3d_format_id format_id,
- WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops)
+ WINED3DPOOL pool, DWORD flags, void *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const struct wined3d_format *format = wined3d_get_format(gl_info, format_id);
+ BOOL lockable = flags & WINED3D_SURFACE_MAPPABLE;
unsigned int resource_size;
HRESULT hr;
@@ -7182,7 +7184,7 @@ static HRESULT surface_init(struct wined3d_surface *surface, WINED3DSURFTYPE sur
/* Flags */
surface->flags = SFLAG_NORMCOORD; /* Default to normalized coords. */
- if (discard)
+ if (flags & WINED3D_SURFACE_DISCARD)
surface->flags |= SFLAG_DISCARD;
if (lockable || format_id == WINED3DFMT_D16_LOCKABLE)
surface->flags |= SFLAG_LOCKABLE;
@@ -7227,18 +7229,18 @@ static HRESULT surface_init(struct wined3d_surface *surface, WINED3DSURFTYPE sur
}
HRESULT CDECL wined3d_surface_create(struct wined3d_device *device, UINT width, UINT height,
- enum wined3d_format_id format_id, BOOL lockable, BOOL discard, UINT level, DWORD usage, WINED3DPOOL pool,
+ enum wined3d_format_id format_id, UINT level, DWORD usage, WINED3DPOOL pool,
WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, WINED3DSURFTYPE surface_type,
- void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_surface **surface)
+ DWORD flags, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_surface **surface)
{
struct wined3d_surface *object;
HRESULT hr;
- TRACE("device %p, width %u, height %u, format %s, lockable %#x, discard %#x, level %u\n",
- device, width, height, debug_d3dformat(format_id), lockable, discard, level);
+ TRACE("device %p, width %u, height %u, format %s, level %u\n",
+ device, width, height, debug_d3dformat(format_id), level);
TRACE("surface %p, usage %s (%#x), pool %s, multisample_type %#x, multisample_quality %u\n",
surface, debug_d3dusage(usage), usage, debug_d3dpool(pool), multisample_type, multisample_quality);
- TRACE("surface_type %#x, parent %p, parent_ops %p.\n", surface_type, parent, parent_ops);
+ TRACE("surface_type %#x, flags %#x, parent %p, parent_ops %p.\n", surface_type, flags, parent, parent_ops);
if (surface_type == SURFACE_OPENGL && !device->adapter)
{
@@ -7253,8 +7255,8 @@ HRESULT CDECL wined3d_surface_create(struct wined3d_device *device, UINT width,
return WINED3DERR_OUTOFVIDEOMEMORY;
}
- hr = surface_init(object, surface_type, device->surface_alignment, width, height, level, lockable,
- discard, multisample_type, multisample_quality, device, usage, format_id, pool, parent, parent_ops);
+ hr = surface_init(object, surface_type, device->surface_alignment, width, height, level,
+ multisample_type, multisample_quality, device, usage, format_id, pool, flags, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize surface, returning %#x.\n", hr);
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 0ba3a08..2f68f14 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1509,6 +1509,9 @@ enum wined3d_sysval_semantic
#define WINEDDPCAPS_2BIT 0x00000200
#define WINEDDPCAPS_ALPHA 0x00000400
+#define WINED3D_SURFACE_MAPPABLE 0x00000001
+#define WINED3D_SURFACE_DISCARD 0x00000002
+
struct wined3d_display_mode
{
UINT width;
@@ -2395,9 +2398,9 @@ HRESULT __cdecl wined3d_surface_blt(struct wined3d_surface *dst_surface, const R
struct wined3d_surface *src_surface, const RECT *src_rect, DWORD flags,
const WINEDDBLTFX *blt_fx, WINED3DTEXTUREFILTERTYPE filter);
HRESULT __cdecl wined3d_surface_create(struct wined3d_device *device, UINT width, UINT height,
- enum wined3d_format_id format_id, BOOL lockable, BOOL discard, UINT level, DWORD usage, WINED3DPOOL pool,
+ enum wined3d_format_id format_id, UINT level, DWORD usage, WINED3DPOOL pool,
WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, WINED3DSURFTYPE surface_type,
- void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_surface **surface);
+ DWORD flags, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_surface **surface);
ULONG __cdecl wined3d_surface_decref(struct wined3d_surface *surface);
HRESULT __cdecl wined3d_surface_flip(struct wined3d_surface *surface, struct wined3d_surface *override, DWORD flags);
HRESULT __cdecl wined3d_surface_get_blt_status(const struct wined3d_surface *surface, DWORD flags);
--
1.7.3.4
More information about the wine-patches
mailing list