[PATCH 1/5] wined3d: Unify WINED3D_RTYPE_TEXTURE and WINED3D_RTYPE_CUBE_TEXTURE.
Henri Verbeet
hverbeet at codeweavers.com
Tue Jan 26 17:06:23 CST 2016
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d3d11/texture.c | 2 +-
dlls/d3d8/device.c | 4 +-
dlls/d3d8/directx.c | 26 +++++++-
dlls/d3d8/texture.c | 6 +-
dlls/d3d9/device.c | 4 +-
dlls/d3d9/directx.c | 26 +++++++-
dlls/d3d9/texture.c | 6 +-
dlls/ddraw/device.c | 6 +-
dlls/ddraw/surface.c | 18 ++---
dlls/wined3d/device.c | 60 +++++++----------
dlls/wined3d/directx.c | 38 ++++-------
dlls/wined3d/resource.c | 148 ++++++++++++++++++++++-------------------
dlls/wined3d/surface.c | 2 +-
dlls/wined3d/swapchain.c | 2 +-
dlls/wined3d/texture.c | 11 ++-
dlls/wined3d/utils.c | 15 ++---
dlls/wined3d/wined3d_private.h | 5 +-
include/wine/wined3d.h | 9 +--
18 files changed, 207 insertions(+), 181 deletions(-)
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c
index 011a5f7..78aac0a 100644
--- a/dlls/d3d11/texture.c
+++ b/dlls/d3d11/texture.c
@@ -462,7 +462,7 @@ static HRESULT d3d_texture2d_init(struct d3d_texture2d *texture, struct d3d_devi
if (desc->SampleDesc.Count > 1)
FIXME("Multisampled textures not implemented.\n");
- wined3d_desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ wined3d_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
wined3d_desc.format = wined3dformat_from_dxgi_format(desc->Format);
wined3d_desc.multisample_type = desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3D_MULTISAMPLE_NONE;
wined3d_desc.multisample_quality = desc->SampleDesc.Quality;
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 653a158..fe1a425 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -619,7 +619,7 @@ static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource)
{
struct d3d8_surface *surface;
- if (desc.resource_type == WINED3D_RTYPE_TEXTURE)
+ if (desc.resource_type == WINED3D_RTYPE_TEXTURE_2D)
{
IUnknown *parent = wined3d_resource_get_parent(resource);
IDirect3DBaseTexture8 *texture;
@@ -950,7 +950,7 @@ static HRESULT d3d8_device_create_surface(struct d3d8_device *device, UINT width
device, width, height, format, flags, surface,
usage, pool, multisample_type, multisample_quality);
- desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = wined3dformat_from_d3dformat(format);
desc.multisample_type = multisample_type;
desc.multisample_quality = multisample_quality;
diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c
index 12fdc02..2db6488 100644
--- a/dlls/d3d8/directx.c
+++ b/dlls/d3d8/directx.c
@@ -238,16 +238,38 @@ static HRESULT WINAPI d3d8_CheckDeviceFormat(IDirect3D8 *iface, UINT adapter, D3
TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, usage %#x, resource_type %#x, format %#x.\n",
iface, adapter, device_type, adapter_format, usage, resource_type, format);
+ usage = usage & (WINED3DUSAGE_MASK | WINED3DUSAGE_QUERY_MASK);
switch (resource_type)
{
+ case D3DRTYPE_SURFACE:
+ wined3d_rtype = WINED3D_RTYPE_SURFACE;
+ break;
+
+ case D3DRTYPE_VOLUME:
+ wined3d_rtype = WINED3D_RTYPE_VOLUME;
+ break;
+
+ case D3DRTYPE_TEXTURE:
+ wined3d_rtype = WINED3D_RTYPE_TEXTURE_2D;
+ break;
+
+ case D3DRTYPE_VOLUMETEXTURE:
+ wined3d_rtype = WINED3D_RTYPE_VOLUME_TEXTURE;
+ break;
+
+ case D3DRTYPE_CUBETEXTURE:
+ wined3d_rtype = WINED3D_RTYPE_TEXTURE_2D;
+ usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
+ break;
+
case D3DRTYPE_VERTEXBUFFER:
case D3DRTYPE_INDEXBUFFER:
wined3d_rtype = WINED3D_RTYPE_BUFFER;
break;
default:
- wined3d_rtype = resource_type;
- break;
+ FIXME("Unhandled resource type %#x.\n", resource_type);
+ return WINED3DERR_INVALIDCALL;
}
wined3d_mutex_lock();
diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c
index 269ce4e..f756e01 100644
--- a/dlls/d3d8/texture.c
+++ b/dlls/d3d8/texture.c
@@ -1157,7 +1157,7 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
d3d8_resource_init(&texture->resource);
list_init(&texture->rtv_list);
- desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = wined3dformat_from_d3dformat(format);
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
@@ -1202,12 +1202,12 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic
d3d8_resource_init(&texture->resource);
list_init(&texture->rtv_list);
- desc.resource_type = WINED3D_RTYPE_CUBE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = wined3dformat_from_d3dformat(format);
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
- desc.usage |= WINED3DUSAGE_TEXTURE;
+ desc.usage |= WINED3DUSAGE_LEGACY_CUBEMAP | WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = edge_length;
desc.height = edge_length;
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index ef019b1..76c5ac6 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -611,7 +611,7 @@ static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource)
{
struct d3d9_surface *surface;
- if (desc.resource_type == WINED3D_RTYPE_TEXTURE)
+ if (desc.resource_type == WINED3D_RTYPE_TEXTURE_2D)
{
IUnknown *parent = wined3d_resource_get_parent(resource);
IDirect3DBaseTexture9 *texture;
@@ -1119,7 +1119,7 @@ static HRESULT d3d9_device_create_surface(struct d3d9_device *device, UINT width
device, width, height, format, flags, surface, usage, pool,
multisample_type, multisample_quality);
- desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = wined3dformat_from_d3dformat(format);
desc.multisample_type = multisample_type;
desc.multisample_quality = multisample_quality;
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index fb18345..1d759c4 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -254,16 +254,38 @@ static HRESULT WINAPI d3d9_CheckDeviceFormat(IDirect3D9Ex *iface, UINT adapter,
TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, usage %#x, resource_type %#x, format %#x.\n",
iface, adapter, device_type, adapter_format, usage, resource_type, format);
+ usage = usage & (WINED3DUSAGE_MASK | WINED3DUSAGE_QUERY_MASK);
switch (resource_type)
{
+ case D3DRTYPE_SURFACE:
+ wined3d_rtype = WINED3D_RTYPE_SURFACE;
+ break;
+
+ case D3DRTYPE_VOLUME:
+ wined3d_rtype = WINED3D_RTYPE_VOLUME;
+ break;
+
+ case D3DRTYPE_TEXTURE:
+ wined3d_rtype = WINED3D_RTYPE_TEXTURE_2D;
+ break;
+
+ case D3DRTYPE_VOLUMETEXTURE:
+ wined3d_rtype = WINED3D_RTYPE_VOLUME_TEXTURE;
+ break;
+
+ case D3DRTYPE_CUBETEXTURE:
+ wined3d_rtype = WINED3D_RTYPE_TEXTURE_2D;
+ usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
+ break;
+
case D3DRTYPE_VERTEXBUFFER:
case D3DRTYPE_INDEXBUFFER:
wined3d_rtype = WINED3D_RTYPE_BUFFER;
break;
default:
- wined3d_rtype = resource_type;
- break;
+ FIXME("Unhandled resource type %#x.\n", resource_type);
+ return WINED3DERR_INVALIDCALL;
}
wined3d_mutex_lock();
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index 1f8f0f2..ebe5e50 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -1287,7 +1287,7 @@ HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device,
d3d9_resource_init(&texture->resource);
list_init(&texture->rtv_list);
- desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = wined3dformat_from_d3dformat(format);
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
@@ -1337,12 +1337,12 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *devic
d3d9_resource_init(&texture->resource);
list_init(&texture->rtv_list);
- desc.resource_type = WINED3D_RTYPE_CUBE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = wined3dformat_from_d3dformat(format);
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
- desc.usage |= WINED3DUSAGE_TEXTURE;
+ desc.usage |= WINED3DUSAGE_LEGACY_CUBEMAP | WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = edge_length;
desc.height = edge_length;
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 408eb24..d654004 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1091,7 +1091,7 @@ static HRESULT d3d_device7_EnumTextureFormats(IDirect3DDevice7 *iface,
for (i = 0; i < sizeof(FormatList) / sizeof(*FormatList); ++i)
{
if (wined3d_check_device_format(device->ddraw->wined3d, WINED3DADAPTER_DEFAULT, WINED3D_DEVICE_TYPE_HAL,
- mode.format_id, 0, WINED3D_RTYPE_TEXTURE, FormatList[i]) == D3D_OK)
+ mode.format_id, 0, WINED3D_RTYPE_TEXTURE_2D, FormatList[i]) == D3D_OK)
{
DDPIXELFORMAT pformat;
@@ -1114,7 +1114,7 @@ static HRESULT d3d_device7_EnumTextureFormats(IDirect3DDevice7 *iface,
{
if (wined3d_check_device_format(device->ddraw->wined3d, WINED3DADAPTER_DEFAULT,
WINED3D_DEVICE_TYPE_HAL, mode.format_id, WINED3DUSAGE_QUERY_LEGACYBUMPMAP,
- WINED3D_RTYPE_TEXTURE, BumpFormatList[i]) == D3D_OK)
+ WINED3D_RTYPE_TEXTURE_2D, BumpFormatList[i]) == D3D_OK)
{
DDPIXELFORMAT pformat;
@@ -1219,7 +1219,7 @@ static HRESULT WINAPI d3d_device2_EnumTextureFormats(IDirect3DDevice2 *iface,
for (i = 0; i < sizeof(FormatList) / sizeof(*FormatList); ++i)
{
if (wined3d_check_device_format(device->ddraw->wined3d, 0, WINED3D_DEVICE_TYPE_HAL,
- mode.format_id, 0, WINED3D_RTYPE_TEXTURE, FormatList[i]) == D3D_OK)
+ mode.format_id, 0, WINED3D_RTYPE_TEXTURE_2D, FormatList[i]) == D3D_OK)
{
DDSURFACEDESC sdesc;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index d8754a3..f842efe 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -5660,8 +5660,9 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
struct wined3d_display_mode mode;
DDSURFACEDESC2 *desc, *mip_desc;
struct ddraw_texture *texture;
- UINT layers, levels, i, j;
+ unsigned int layers = 1;
unsigned int pitch = 0;
+ UINT levels, i, j;
HRESULT hr;
TRACE("ddraw %p, surface_desc %p, surface %p, outer_unknown %p, version %u.\n",
@@ -5793,6 +5794,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
ddrawformat_from_wined3dformat(&desc->u4.ddpfPixelFormat, mode.format_id);
}
+ wined3d_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
wined3d_desc.format = wined3dformat_from_ddrawformat(&desc->u4.ddpfPixelFormat);
if (wined3d_desc.format == WINED3DFMT_UNKNOWN)
{
@@ -5908,9 +5910,12 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
DWORD usage = 0;
if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
- rtype = WINED3D_RTYPE_CUBE_TEXTURE;
+ {
+ usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
+ rtype = WINED3D_RTYPE_TEXTURE_2D;
+ }
else if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
- rtype = WINED3D_RTYPE_TEXTURE;
+ rtype = WINED3D_RTYPE_TEXTURE_2D;
else
rtype = WINED3D_RTYPE_SURFACE;
@@ -6060,14 +6065,9 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
{
- wined3d_desc.resource_type = WINED3D_RTYPE_CUBE_TEXTURE;
+ wined3d_desc.usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
layers = 6;
}
- else
- {
- wined3d_desc.resource_type = WINED3D_RTYPE_TEXTURE;
- layers = 1;
- }
/* Some applications assume surfaces will always be mapped at the same
* address. Some of those also assume that this address is valid even when
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 046b04d..dfbec0f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -623,7 +623,7 @@ static void device_load_logo(struct wined3d_device *device, const char *filename
bm.bmHeight = 32;
}
- desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = WINED3DFMT_B5G6R5_UNORM;
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
@@ -2016,7 +2016,7 @@ static void resolve_depth_buffer(struct wined3d_state *state)
struct wined3d_texture *texture = state->textures[0];
struct wined3d_surface *depth_stencil, *surface;
- if (!texture || texture->resource.type != WINED3D_RTYPE_TEXTURE
+ if (!texture || texture->resource.type != WINED3D_RTYPE_TEXTURE_2D
|| !(texture->resource.format_flags & WINED3DFMT_FLAG_DEPTH))
return;
surface = surface_from_resource(texture->sub_resources[0]);
@@ -3586,8 +3586,9 @@ static HRESULT device_update_volume(struct wined3d_device *device,
HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
struct wined3d_texture *src_texture, struct wined3d_texture *dst_texture)
{
+ unsigned int src_size, dst_size, src_skip_levels = 0;
+ unsigned int layer_count, level_count, i, j;
enum wined3d_resource_type type;
- unsigned int level_count, i, j, src_size, dst_size, src_skip_levels = 0;
HRESULT hr;
struct wined3d_context *context;
@@ -3619,6 +3620,13 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
return WINED3DERR_INVALIDCALL;
}
+ layer_count = src_texture->layer_count;
+ if (layer_count != dst_texture->layer_count)
+ {
+ WARN("Source and destination have different layer counts.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
level_count = min(wined3d_texture_get_level_count(src_texture),
wined3d_texture_get_level_count(dst_texture));
@@ -3643,34 +3651,14 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
/* Update every surface level of the texture. */
switch (type)
{
- case WINED3D_RTYPE_TEXTURE:
- {
- struct wined3d_surface *src_surface;
- struct wined3d_surface *dst_surface;
-
- for (i = 0; i < level_count; ++i)
- {
- src_surface = surface_from_resource(wined3d_texture_get_sub_resource(src_texture,
- i + src_skip_levels));
- dst_surface = surface_from_resource(wined3d_texture_get_sub_resource(dst_texture, i));
- hr = wined3d_device_update_surface(device, src_surface, NULL, dst_surface, NULL);
- if (FAILED(hr))
- {
- WARN("Failed to update surface, hr %#x.\n", hr);
- return hr;
- }
- }
- break;
- }
-
- case WINED3D_RTYPE_CUBE_TEXTURE:
+ case WINED3D_RTYPE_TEXTURE_2D:
{
+ unsigned int src_levels = src_texture->level_count;
+ unsigned int dst_levels = dst_texture->level_count;
struct wined3d_surface *src_surface;
struct wined3d_surface *dst_surface;
- unsigned int src_levels = wined3d_texture_get_level_count(src_texture);
- unsigned int dst_levels = wined3d_texture_get_level_count(dst_texture);
- for (i = 0; i < 6; ++i)
+ for (i = 0; i < layer_count; ++i)
{
for (j = 0; j < level_count; ++j)
{
@@ -3678,8 +3666,7 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
i * src_levels + j + src_skip_levels));
dst_surface = surface_from_resource(wined3d_texture_get_sub_resource(dst_texture,
i * dst_levels + j));
- hr = wined3d_device_update_surface(device, src_surface, NULL, dst_surface, NULL);
- if (FAILED(hr))
+ if (FAILED(hr = wined3d_device_update_surface(device, src_surface, NULL, dst_surface, NULL)))
{
WARN("Failed to update surface, hr %#x.\n", hr);
return hr;
@@ -3915,7 +3902,7 @@ void CDECL wined3d_device_copy_resource(struct wined3d_device *device,
return;
}
- if (dst_resource->type != WINED3D_RTYPE_TEXTURE)
+ if (dst_resource->type != WINED3D_RTYPE_TEXTURE_2D)
{
FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(dst_resource->type));
return;
@@ -3982,7 +3969,7 @@ HRESULT CDECL wined3d_device_copy_sub_resource_region(struct wined3d_device *dev
return WINED3DERR_INVALIDCALL;
}
- if (dst_resource->type != WINED3D_RTYPE_TEXTURE)
+ if (dst_resource->type != WINED3D_RTYPE_TEXTURE_2D)
{
FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(dst_resource->type));
return WINED3DERR_INVALIDCALL;
@@ -4071,7 +4058,7 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
return;
}
- if (resource->type != WINED3D_RTYPE_TEXTURE)
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D)
{
FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(resource->type));
return;
@@ -4144,7 +4131,7 @@ HRESULT CDECL wined3d_device_clear_rendertarget_view(struct wined3d_device *devi
device, view, wine_dbgstr_rect(rect), color->r, color->g, color->b, color->a);
resource = view->resource;
- if (resource->type != WINED3D_RTYPE_TEXTURE && resource->type != WINED3D_RTYPE_CUBE_TEXTURE)
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D)
{
FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(resource->type));
return WINED3DERR_INVALIDCALL;
@@ -4286,7 +4273,7 @@ static struct wined3d_texture *wined3d_device_create_cursor_texture(struct wined
data.row_pitch = map_desc.row_pitch;
data.slice_pitch = map_desc.slice_pitch;
- desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = WINED3DFMT_B8G8R8A8_UNORM;
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
@@ -4793,7 +4780,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
TRACE("Creating the depth stencil buffer\n");
- texture_desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ texture_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
texture_desc.format = swapchain->desc.auto_depth_stencil_format;
texture_desc.multisample_type = swapchain->desc.multisample_type;
texture_desc.multisample_quality = swapchain->desc.multisample_quality;
@@ -4983,8 +4970,7 @@ void device_resource_released(struct wined3d_device *device, struct wined3d_reso
}
break;
- case WINED3D_RTYPE_TEXTURE:
- case WINED3D_RTYPE_CUBE_TEXTURE:
+ case WINED3D_RTYPE_TEXTURE_2D:
case WINED3D_RTYPE_VOLUME_TEXTURE:
for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
{
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5041249..cc6e5e1 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -4619,21 +4619,6 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
switch (resource_type)
{
- case WINED3D_RTYPE_CUBE_TEXTURE:
- format_flags |= WINED3DFMT_FLAG_TEXTURE;
- allowed_usage = WINED3DUSAGE_AUTOGENMIPMAP
- | WINED3DUSAGE_DYNAMIC
- | WINED3DUSAGE_RENDERTARGET
- | WINED3DUSAGE_SOFTWAREPROCESSING
- | WINED3DUSAGE_QUERY_FILTER
- | WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING
- | WINED3DUSAGE_QUERY_SRGBREAD
- | WINED3DUSAGE_QUERY_SRGBWRITE
- | WINED3DUSAGE_QUERY_VERTEXTEXTURE
- | WINED3DUSAGE_QUERY_WRAPANDMIP;
- gl_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
- break;
-
case WINED3D_RTYPE_SURFACE:
if (!CheckSurfaceCapability(adapter, adapter_format, format, wined3d->flags & WINED3D_NO3D))
{
@@ -4647,19 +4632,12 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
gl_type = WINED3D_GL_RES_TYPE_RB;
break;
- case WINED3D_RTYPE_TEXTURE:
- if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
- && (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_SHADOW)
- && !gl_info->supported[ARB_SHADOW])
- {
- TRACE("[FAILED] - No shadow sampler support.\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
+ case WINED3D_RTYPE_TEXTURE_2D:
format_flags |= WINED3DFMT_FLAG_TEXTURE;
allowed_usage = WINED3DUSAGE_AUTOGENMIPMAP
| WINED3DUSAGE_DEPTHSTENCIL
| WINED3DUSAGE_DYNAMIC
+ | WINED3DUSAGE_LEGACY_CUBEMAP
| WINED3DUSAGE_RENDERTARGET
| WINED3DUSAGE_SOFTWAREPROCESSING
| WINED3DUSAGE_QUERY_FILTER
@@ -4670,6 +4648,18 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
| WINED3DUSAGE_QUERY_VERTEXTEXTURE
| WINED3DUSAGE_QUERY_WRAPANDMIP;
gl_type = WINED3D_GL_RES_TYPE_TEX_2D;
+ if (usage & WINED3DUSAGE_LEGACY_CUBEMAP)
+ {
+ allowed_usage &= ~(WINED3DUSAGE_DEPTHSTENCIL | WINED3DUSAGE_QUERY_LEGACYBUMPMAP);
+ gl_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
+ }
+ else if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
+ && (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_SHADOW)
+ && !gl_info->supported[ARB_SHADOW])
+ {
+ TRACE("[FAILED] - No shadow sampler support.\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
break;
case WINED3D_RTYPE_VOLUME_TEXTURE:
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index d466764..4ebcd04 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -57,6 +57,7 @@ static void resource_check_usage(DWORD usage)
| WINED3DUSAGE_AUTOGENMIPMAP
| WINED3DUSAGE_STATICDECL
| WINED3DUSAGE_OVERLAY
+ | WINED3DUSAGE_LEGACY_CUBEMAP
| WINED3DUSAGE_TEXTURE;
/* WINED3DUSAGE_WRITEONLY is supposed to result in write-combined mappings
@@ -78,84 +79,93 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *
void *parent, const struct wined3d_parent_ops *parent_ops,
const struct wined3d_resource_ops *resource_ops)
{
- const struct wined3d *d3d = device->wined3d;
+ enum wined3d_gl_resource_type base_type = WINED3D_GL_RES_TYPE_COUNT;
+ enum wined3d_gl_resource_type gl_type = WINED3D_GL_RES_TYPE_COUNT;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- static const enum wined3d_gl_resource_type gl_resource_types[][4] =
+ BOOL tex_2d_ok = FALSE;
+ unsigned int i;
+
+ static const struct
+ {
+ enum wined3d_resource_type type;
+ DWORD cube_usage;
+ enum wined3d_gl_resource_type gl_type;
+ }
+ resource_types[] =
{
- /* 0 */ {WINED3D_GL_RES_TYPE_COUNT},
- /* WINED3D_RTYPE_SURFACE */ {WINED3D_GL_RES_TYPE_COUNT},
- /* WINED3D_RTYPE_VOLUME */ {WINED3D_GL_RES_TYPE_COUNT},
- /* WINED3D_RTYPE_TEXTURE */ {WINED3D_GL_RES_TYPE_TEX_2D,
- WINED3D_GL_RES_TYPE_TEX_RECT, WINED3D_GL_RES_TYPE_RB, WINED3D_GL_RES_TYPE_COUNT},
- /* WINED3D_RTYPE_VOLUME_TEXTURE */ {WINED3D_GL_RES_TYPE_TEX_3D, WINED3D_GL_RES_TYPE_COUNT},
- /* WINED3D_RTYPE_CUBE_TEXTURE */ {WINED3D_GL_RES_TYPE_TEX_CUBE, WINED3D_GL_RES_TYPE_COUNT},
- /* WINED3D_RTYPE_BUFFER */ {WINED3D_GL_RES_TYPE_BUFFER, WINED3D_GL_RES_TYPE_COUNT},
+ {WINED3D_RTYPE_BUFFER, 0, WINED3D_GL_RES_TYPE_BUFFER},
+ {WINED3D_RTYPE_TEXTURE_2D, 0, WINED3D_GL_RES_TYPE_TEX_2D},
+ {WINED3D_RTYPE_TEXTURE_2D, 0, WINED3D_GL_RES_TYPE_TEX_RECT},
+ {WINED3D_RTYPE_TEXTURE_2D, 0, WINED3D_GL_RES_TYPE_RB},
+ {WINED3D_RTYPE_TEXTURE_2D, WINED3DUSAGE_LEGACY_CUBEMAP, WINED3D_GL_RES_TYPE_TEX_CUBE},
+ {WINED3D_RTYPE_VOLUME_TEXTURE, 0, WINED3D_GL_RES_TYPE_TEX_3D},
};
- enum wined3d_gl_resource_type gl_type = WINED3D_GL_RES_TYPE_COUNT;
- enum wined3d_gl_resource_type base_type = gl_resource_types[type][0];
resource_check_usage(usage);
- if (base_type != WINED3D_GL_RES_TYPE_COUNT)
+ for (i = 0; i < ARRAY_SIZE(resource_types); ++i)
{
- unsigned int i;
- BOOL tex_2d_ok = FALSE;
+ if (resource_types[i].type != type
+ || resource_types[i].cube_usage != (usage & WINED3DUSAGE_LEGACY_CUBEMAP))
+ continue;
+
+ gl_type = resource_types[i].gl_type;
+ if (base_type == WINED3D_GL_RES_TYPE_COUNT)
+ base_type = gl_type;
- for (i = 0; (gl_type = gl_resource_types[type][i]) != WINED3D_GL_RES_TYPE_COUNT; i++)
+ if ((usage & WINED3DUSAGE_RENDERTARGET) && !(format->flags[gl_type] & WINED3DFMT_FLAG_RENDERTARGET))
{
- if ((usage & WINED3DUSAGE_RENDERTARGET) && !(format->flags[gl_type] & WINED3DFMT_FLAG_RENDERTARGET))
- {
- WARN("Format %s cannot be used for render targets.\n", debug_d3dformat(format->id));
- continue;
- }
- if ((usage & WINED3DUSAGE_DEPTHSTENCIL) &&
- !(format->flags[gl_type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
- {
- WARN("Format %s cannot be used for depth/stencil buffers.\n", debug_d3dformat(format->id));
- continue;
- }
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
- && usage & (WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_DEPTHSTENCIL)
- && !(format->flags[gl_type] & WINED3DFMT_FLAG_FBO_ATTACHABLE))
- {
- WARN("Render target or depth stencil is not FBO attachable.\n");
- continue;
- }
- if ((usage & WINED3DUSAGE_TEXTURE) && !(format->flags[gl_type] & WINED3DFMT_FLAG_TEXTURE))
- {
- WARN("Format %s cannot be used for texturing.\n", debug_d3dformat(format->id));
- continue;
- }
- if (((width & (width - 1)) || (height & (height - 1)))
- && !gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]
- && !gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT]
- && gl_type == WINED3D_GL_RES_TYPE_TEX_2D)
- {
- TRACE("Skipping 2D texture type to try texture rectangle.\n");
- tex_2d_ok = TRUE;
- continue;
- }
- break;
+ WARN("Format %s cannot be used for render targets.\n", debug_d3dformat(format->id));
+ continue;
}
+ if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
+ && !(format->flags[gl_type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
+ {
+ WARN("Format %s cannot be used for depth/stencil buffers.\n", debug_d3dformat(format->id));
+ continue;
+ }
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
+ && usage & (WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_DEPTHSTENCIL)
+ && !(format->flags[gl_type] & WINED3DFMT_FLAG_FBO_ATTACHABLE))
+ {
+ WARN("Render target or depth stencil is not FBO attachable.\n");
+ continue;
+ }
+ if ((usage & WINED3DUSAGE_TEXTURE) && !(format->flags[gl_type] & WINED3DFMT_FLAG_TEXTURE))
+ {
+ WARN("Format %s cannot be used for texturing.\n", debug_d3dformat(format->id));
+ continue;
+ }
+ if (((width & (width - 1)) || (height & (height - 1)))
+ && !gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]
+ && !gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT]
+ && gl_type == WINED3D_GL_RES_TYPE_TEX_2D)
+ {
+ TRACE("Skipping 2D texture type to try texture rectangle.\n");
+ tex_2d_ok = TRUE;
+ continue;
+ }
+ break;
+ }
- if (gl_type == WINED3D_GL_RES_TYPE_COUNT)
+ if (base_type != WINED3D_GL_RES_TYPE_COUNT && i == ARRAY_SIZE(resource_types))
+ {
+ if (tex_2d_ok)
{
- if (tex_2d_ok)
- {
- /* Non power of 2 texture and rectangle textures or renderbuffers do not work.
- * Use 2D textures, the texture code will pad to a power of 2 size. */
- gl_type = WINED3D_GL_RES_TYPE_TEX_2D;
- }
- else if (pool == WINED3D_POOL_SCRATCH)
- {
- /* Needed for proper format information. */
- gl_type = base_type;
- }
- else
- {
- WARN("Did not find a suitable GL resource type, resource type, d3d type %u.\n", type);
- return WINED3DERR_INVALIDCALL;
- }
+ /* Non power of 2 texture and rectangle textures or renderbuffers do not work.
+ * Use 2D textures, the texture code will pad to a power of 2 size. */
+ gl_type = WINED3D_GL_RES_TYPE_TEX_2D;
+ }
+ else if (pool == WINED3D_POOL_SCRATCH)
+ {
+ /* Needed for proper format information. */
+ gl_type = base_type;
+ }
+ else
+ {
+ WARN("Did not find a suitable GL resource type for resource type %s.\n",
+ debug_d3dresourcetype(type));
+ return WINED3DERR_INVALIDCALL;
}
}
@@ -207,7 +217,7 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *
}
/* Check that we have enough video ram left */
- if (pool == WINED3D_POOL_DEFAULT && d3d->flags & WINED3D_VIDMEM_ACCOUNTING)
+ if (pool == WINED3D_POOL_DEFAULT && device->wined3d->flags & WINED3D_VIDMEM_ACCOUNTING)
{
if (size > wined3d_device_get_available_texture_mem(device))
{
@@ -402,8 +412,8 @@ BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource)
{
struct wined3d_swapchain *swapchain;
- /* Only texture resources can be onscreen. */
- if (resource->type != WINED3D_RTYPE_TEXTURE)
+ /* Only 2D texture resources can be onscreen. */
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D)
return TRUE;
/* Not on a swapchain - must be offscreen */
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index db33791..bdf681b 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -2340,7 +2340,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_surface *so
/* FIXME: Multisampled conversion? */
wined3d_resource_get_desc(&source->resource, &desc);
- desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
desc.format = to_fmt;
desc.usage = 0;
desc.pool = WINED3D_POOL_SCRATCH;
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 069b071..7728cdc 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -821,7 +821,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
TRACE("Creating front buffer.\n");
- texture_desc.resource_type = WINED3D_RTYPE_TEXTURE;
+ texture_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
texture_desc.format = swapchain->desc.backbuffer_format;
texture_desc.multisample_type = swapchain->desc.multisample_type;
texture_desc.multisample_quality = swapchain->desc.multisample_quality;
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 364294b..5eea7d2 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -1450,18 +1450,17 @@ HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct
switch (desc->resource_type)
{
- case WINED3D_RTYPE_TEXTURE:
- hr = texture_init(object, desc, level_count, surface_flags, device, parent, parent_ops);
+ case WINED3D_RTYPE_TEXTURE_2D:
+ if (desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP)
+ hr = cubetexture_init(object, desc, level_count, surface_flags, device, parent, parent_ops);
+ else
+ hr = texture_init(object, desc, level_count, surface_flags, device, parent, parent_ops);
break;
case WINED3D_RTYPE_VOLUME_TEXTURE:
hr = volumetexture_init(object, desc, level_count, device, parent, parent_ops);
break;
- case WINED3D_RTYPE_CUBE_TEXTURE:
- hr = cubetexture_init(object, desc, level_count, surface_flags, device, parent, parent_ops);
- break;
-
default:
ERR("Invalid resource type %s.\n", debug_d3dresourcetype(desc->resource_type));
hr = WINED3DERR_INVALIDCALL;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 5844aa6..a4829b6 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -3202,14 +3202,13 @@ const char *debug_d3dresourcetype(enum wined3d_resource_type resource_type)
{
switch (resource_type)
{
-#define RES_TO_STR(res) case res: return #res
- RES_TO_STR(WINED3D_RTYPE_SURFACE);
- RES_TO_STR(WINED3D_RTYPE_VOLUME);
- RES_TO_STR(WINED3D_RTYPE_TEXTURE);
- RES_TO_STR(WINED3D_RTYPE_VOLUME_TEXTURE);
- RES_TO_STR(WINED3D_RTYPE_CUBE_TEXTURE);
- RES_TO_STR(WINED3D_RTYPE_BUFFER);
-#undef RES_TO_STR
+#define WINED3D_TO_STR(x) case x: return #x
+ WINED3D_TO_STR(WINED3D_RTYPE_SURFACE);
+ WINED3D_TO_STR(WINED3D_RTYPE_VOLUME);
+ WINED3D_TO_STR(WINED3D_RTYPE_VOLUME_TEXTURE);
+ WINED3D_TO_STR(WINED3D_RTYPE_BUFFER);
+ WINED3D_TO_STR(WINED3D_RTYPE_TEXTURE_2D);
+#undef WINED3D_TO_STR
default:
FIXME("Unrecognized resource type %#x.\n", resource_type);
return "unrecognized";
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index ed28507..191733a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2796,10 +2796,7 @@ static inline struct wined3d_surface *wined3d_rendertarget_view_get_surface(
struct wined3d_resource *resource;
struct wined3d_texture *texture;
- if (!view)
- return NULL;
-
- if (view->resource->type != WINED3D_RTYPE_TEXTURE && view->resource->type != WINED3D_RTYPE_CUBE_TEXTURE)
+ if (!view || view->resource->type != WINED3D_RTYPE_TEXTURE_2D)
return NULL;
texture = wined3d_texture_from_resource(view->resource);
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 300b322..0190d12 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -657,10 +657,9 @@ enum wined3d_resource_type
{
WINED3D_RTYPE_SURFACE = 1,
WINED3D_RTYPE_VOLUME = 2,
- WINED3D_RTYPE_TEXTURE = 3,
- WINED3D_RTYPE_VOLUME_TEXTURE = 4,
- WINED3D_RTYPE_CUBE_TEXTURE = 5,
- WINED3D_RTYPE_BUFFER = 6,
+ WINED3D_RTYPE_VOLUME_TEXTURE = 3,
+ WINED3D_RTYPE_BUFFER = 4,
+ WINED3D_RTYPE_TEXTURE_2D = 5,
};
enum wined3d_pool
@@ -821,6 +820,8 @@ enum wined3d_display_rotation
#define WINED3DUSAGE_DMAP 0x00004000
#define WINED3DUSAGE_TEXTAPI 0x10000000
#define WINED3DUSAGE_MASK 0x10007fff
+
+#define WINED3DUSAGE_LEGACY_CUBEMAP 0x00800000
#define WINED3DUSAGE_TEXTURE 0x01000000
#define WINED3DUSAGE_OWNDC 0x02000000
#define WINED3DUSAGE_STATICDECL 0x04000000
--
2.1.4
More information about the wine-patches
mailing list