[PATCH 6/6] wined3d: Merge wined3d_surface_map() and wined3d_volume_map().
Henri Verbeet
hverbeet at codeweavers.com
Fri Mar 11 09:01:43 CST 2016
From: Stefan Dösinger <stefan at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d3d8/volume.c | 5 +-
dlls/d3d9/volume.c | 5 +-
dlls/wined3d/surface.c | 153 ------------------------
dlls/wined3d/texture.c | 256 ++++++++++++++++++++++++++++++++++++-----
dlls/wined3d/volume.c | 163 +-------------------------
dlls/wined3d/wined3d_private.h | 12 +-
6 files changed, 245 insertions(+), 349 deletions(-)
diff --git a/dlls/d3d8/volume.c b/dlls/d3d8/volume.c
index dd75fff..fb3afb3 100644
--- a/dlls/d3d8/volume.c
+++ b/dlls/d3d8/volume.c
@@ -146,8 +146,9 @@ static HRESULT WINAPI d3d8_volume_LockBox(IDirect3DVolume8 *iface,
iface, locked_box, box, flags);
wined3d_mutex_lock();
- hr = wined3d_resource_map(wined3d_texture_get_resource(volume->wined3d_texture), volume->sub_resource_idx,
- &map_desc, (const struct wined3d_box *)box, flags);
+ if (FAILED(hr = wined3d_resource_map(wined3d_texture_get_resource(volume->wined3d_texture),
+ volume->sub_resource_idx, &map_desc, (const struct wined3d_box *)box, flags)))
+ map_desc.data = NULL;
wined3d_mutex_unlock();
locked_box->RowPitch = map_desc.row_pitch;
diff --git a/dlls/d3d9/volume.c b/dlls/d3d9/volume.c
index c032a01..0346f98 100644
--- a/dlls/d3d9/volume.c
+++ b/dlls/d3d9/volume.c
@@ -146,8 +146,9 @@ static HRESULT WINAPI d3d9_volume_LockBox(IDirect3DVolume9 *iface,
iface, locked_box, box, flags);
wined3d_mutex_lock();
- hr = wined3d_resource_map(wined3d_texture_get_resource(volume->wined3d_texture), volume->sub_resource_idx,
- &map_desc, (const struct wined3d_box *)box, flags);
+ if (FAILED(hr = wined3d_resource_map(wined3d_texture_get_resource(volume->wined3d_texture),
+ volume->sub_resource_idx, &map_desc, (const struct wined3d_box *)box, flags)))
+ map_desc.data = NULL;
wined3d_mutex_unlock();
locked_box->RowPitch = map_desc.row_pitch;
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 1169c00..574069b 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -2078,159 +2078,6 @@ do { \
return WINED3D_OK;
}
-HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_desc *map_desc,
- const struct wined3d_box *box, DWORD flags)
-{
- struct wined3d_texture *texture = surface->container;
- const struct wined3d_format *format = texture->resource.format;
- struct wined3d_device *device = texture->resource.device;
- unsigned int fmt_flags = texture->resource.format_flags;
- const struct wined3d_gl_info *gl_info = NULL;
- struct wined3d_context *context = NULL;
- BYTE *base_memory;
-
- TRACE("surface %p, map_desc %p, box %s, flags %#x.\n",
- surface, map_desc, debug_box(box), flags);
-
- if (surface->resource.map_count)
- {
- WARN("Surface is already mapped.\n");
- return WINED3DERR_INVALIDCALL;
- }
-
- if ((fmt_flags & WINED3DFMT_FLAG_BLOCKS) && box
- && !wined3d_texture_check_block_align(texture, surface->texture_level, box))
- {
- WARN("Map box %s is misaligned for %ux%u blocks.\n",
- debug_box(box), format->block_width, format->block_height);
-
- if (surface->resource.pool == WINED3D_POOL_DEFAULT)
- return WINED3DERR_INVALIDCALL;
- }
-
- ++surface->resource.map_count;
-
- if (!(surface->resource.access_flags & WINED3D_RESOURCE_ACCESS_CPU))
- WARN("Trying to lock unlockable surface.\n");
-
- flags = wined3d_resource_sanitize_map_flags(&texture->resource, flags);
-
- if (device->d3d_initialized)
- {
- context = context_acquire(device, NULL);
- gl_info = context->gl_info;
- }
-
- if (flags & WINED3D_MAP_DISCARD)
- {
- TRACE("WINED3D_MAP_DISCARD flag passed, marking %s as up to date.\n",
- wined3d_debug_location(surface->resource.map_binding));
- wined3d_surface_prepare(surface, context, surface->resource.map_binding);
- surface_validate_location(surface, surface->resource.map_binding);
- }
- else
- {
- if (surface->resource.usage & WINED3DUSAGE_DYNAMIC)
- WARN_(d3d_perf)("Mapping a dynamic surface without WINED3D_MAP_DISCARD.\n");
-
- surface_load_location(surface, context, surface->resource.map_binding);
- }
-
- if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY)))
- surface_invalidate_location(surface, ~surface->resource.map_binding);
-
- switch (surface->resource.map_binding)
- {
- case WINED3D_LOCATION_SYSMEM:
- base_memory = surface->resource.heap_memory;
- break;
-
- case WINED3D_LOCATION_USER_MEMORY:
- base_memory = texture->user_memory;
- break;
-
- case WINED3D_LOCATION_DIB:
- base_memory = surface->dib.bitmap_data;
- break;
-
- case WINED3D_LOCATION_BUFFER:
- GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER,
- texture->sub_resources[surface_get_sub_resource_idx(surface)].buffer_object));
-
- if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
- {
- GLbitfield map_flags = wined3d_resource_gl_map_flags(flags);
- map_flags &= ~GL_MAP_FLUSH_EXPLICIT_BIT;
- base_memory = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER,
- 0, surface->resource.size, map_flags));
- }
- else
- {
- GLenum access = wined3d_resource_gl_legacy_map_flags(flags);
- base_memory = GL_EXTCALL(glMapBuffer(GL_PIXEL_UNPACK_BUFFER, access));
- }
-
- GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
- checkGLcall("map PBO");
- break;
-
- default:
- ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding));
- base_memory = NULL;
- }
-
- if (context)
- context_release(context);
-
- if (fmt_flags & WINED3DFMT_FLAG_BROKEN_PITCH)
- {
- map_desc->row_pitch = surface->resource.width * format->byte_count;
- map_desc->slice_pitch = surface->resource.height * map_desc->row_pitch;
- }
- else
- {
- wined3d_texture_get_pitch(texture, surface->texture_level,
- &map_desc->row_pitch, &map_desc->slice_pitch);
- }
-
- if (!box)
- {
- map_desc->data = base_memory;
- }
- else
- {
- if ((fmt_flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS)
- {
- /* Compressed textures are block based, so calculate the offset of
- * the block that contains the top-left pixel of the locked rectangle. */
- map_desc->data = base_memory
- + ((box->top / format->block_height) * map_desc->row_pitch)
- + ((box->left / format->block_width) * format->block_byte_count);
- }
- else
- {
- map_desc->data = base_memory
- + (map_desc->row_pitch * box->top)
- + (box->left * format->byte_count);
- }
- }
-
- if (texture->swapchain && texture->swapchain->front_buffer == texture)
- {
- RECT *r = &texture->swapchain->front_buffer_update;
-
- if (!box)
- SetRect(r, 0, 0, texture->resource.width, texture->resource.height);
- else
- SetRect(r, box->left, box->top, box->right, box->bottom);
- TRACE("Mapped front buffer %s.\n", wine_dbgstr_rect(r));
- }
-
- TRACE("Returning memory %p, pitch %u.\n", map_desc->data, map_desc->row_pitch);
-
- return WINED3D_OK;
-}
-
static void read_from_framebuffer(struct wined3d_surface *surface,
struct wined3d_context *old_ctx, DWORD dst_location)
{
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 9963c75..e0b5510 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -25,6 +25,7 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
+WINE_DECLARE_DEBUG_CHANNEL(d3d_perf);
WINE_DECLARE_DEBUG_CHANNEL(winediag);
static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struct wined3d_texture_ops *texture_ops,
@@ -528,6 +529,22 @@ void * CDECL wined3d_texture_get_parent(const struct wined3d_texture *texture)
return texture->resource.parent;
}
+static BOOL wined3d_texture_check_box_dimensions(const struct wined3d_texture *texture,
+ unsigned int level, const struct wined3d_box *box)
+{
+ if (box->left >= box->right
+ || box->top >= box->bottom
+ || box->front >= box->back)
+ return FALSE;
+
+ if (box->right > wined3d_texture_get_level_width(texture, level)
+ || box->bottom > wined3d_texture_get_level_height(texture, level)
+ || box->back > wined3d_texture_get_level_depth(texture, level))
+ return FALSE;
+
+ return TRUE;
+}
+
void CDECL wined3d_texture_get_pitch(const struct wined3d_texture *texture,
unsigned int level, unsigned int *row_pitch, unsigned int *slice_pitch)
{
@@ -889,6 +906,19 @@ static void texture2d_sub_resource_upload_data(struct wined3d_resource *sub_reso
&src_rect, data->row_pitch, &dst_point, FALSE, &addr);
}
+static BOOL texture2d_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ struct wined3d_context *context, DWORD location)
+{
+ return SUCCEEDED(surface_load_location(texture->sub_resources[sub_resource_idx].u.surface, context, location));
+}
+
+static BOOL texture2d_prepare_location(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ struct wined3d_context *context, DWORD location)
+{
+ wined3d_surface_prepare(texture->sub_resources[sub_resource_idx].u.surface, context, location);
+ return TRUE;
+}
+
/* Context activation is done by the caller. */
static void texture2d_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb)
{
@@ -974,6 +1004,8 @@ static const struct wined3d_texture_ops texture2d_ops =
texture2d_sub_resource_invalidate_location,
texture2d_sub_resource_validate_location,
texture2d_sub_resource_upload_data,
+ texture2d_load_location,
+ texture2d_prepare_location,
texture2d_prepare_texture,
texture2d_cleanup_sub_resources,
};
@@ -1017,15 +1049,191 @@ static void wined3d_texture_unload(struct wined3d_resource *resource)
wined3d_texture_unload_gl_texture(texture);
}
-static HRESULT texture2d_resource_sub_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx,
+static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx,
struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags)
{
+ const struct wined3d_format *format = resource->format;
+ struct wined3d_device *device = resource->device;
+ unsigned int fmt_flags = resource->format_flags;
+ const struct wined3d_gl_info *gl_info = NULL;
+ struct wined3d_context *context = NULL;
struct wined3d_resource *sub_resource;
+ struct wined3d_texture *texture;
+ unsigned int texture_level;
+ BYTE *base_memory;
+ BOOL ret;
+
+ TRACE("resource %p, sub_resource_idx %u, map_desc %p, box %s, flags %#x.\n",
+ resource, sub_resource_idx, map_desc, debug_box(box), flags);
- if (!(sub_resource = wined3d_texture_get_sub_resource(wined3d_texture_from_resource(resource), sub_resource_idx)))
+ texture = wined3d_texture_from_resource(resource);
+ if (!(sub_resource = wined3d_texture_get_sub_resource(texture, sub_resource_idx)))
return E_INVALIDARG;
- return wined3d_surface_map(surface_from_resource(sub_resource), map_desc, box, flags);
+ texture_level = sub_resource_idx % texture->level_count;
+ if (box && !wined3d_texture_check_box_dimensions(texture, texture_level, box))
+ {
+ WARN("Map box is invalid.\n");
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D)
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if ((fmt_flags & WINED3DFMT_FLAG_BLOCKS) && box
+ && !wined3d_texture_check_block_align(texture, texture_level, box))
+ {
+ WARN("Map box %s is misaligned for %ux%u blocks.\n",
+ debug_box(box), format->block_width, format->block_height);
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D || resource->pool == WINED3D_POOL_DEFAULT)
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if (!(resource->access_flags & WINED3D_RESOURCE_ACCESS_CPU))
+ {
+ WARN("Trying to map unmappable texture.\n");
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D)
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if (sub_resource->map_count)
+ {
+ WARN("Sub-resource is already mapped.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ flags = wined3d_resource_sanitize_map_flags(resource, flags);
+
+ if (device->d3d_initialized)
+ {
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
+ }
+
+ if (flags & WINED3D_MAP_DISCARD)
+ {
+ TRACE("WINED3D_MAP_DISCARD flag passed, marking %s as up to date.\n",
+ wined3d_debug_location(sub_resource->map_binding));
+ if ((ret = texture->texture_ops->texture_prepare_location(texture,
+ sub_resource_idx, context, sub_resource->map_binding)))
+ texture->texture_ops->texture_sub_resource_validate_location(sub_resource, sub_resource->map_binding);
+ }
+ else
+ {
+ if (resource->usage & WINED3DUSAGE_DYNAMIC)
+ WARN_(d3d_perf)("Mapping a dynamic texture without WINED3D_MAP_DISCARD.\n");
+ ret = texture->texture_ops->texture_load_location(texture,
+ sub_resource_idx, context, sub_resource->map_binding);
+ }
+
+ if (!ret)
+ {
+ ERR("Failed to prepare location.\n");
+ context_release(context);
+ return E_OUTOFMEMORY;
+ }
+
+ if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY)))
+ texture->texture_ops->texture_sub_resource_invalidate_location(sub_resource, ~sub_resource->map_binding);
+
+ switch (sub_resource->map_binding)
+ {
+ case WINED3D_LOCATION_SYSMEM:
+ base_memory = sub_resource->heap_memory;
+ break;
+
+ case WINED3D_LOCATION_USER_MEMORY:
+ base_memory = texture->user_memory;
+ break;
+
+ case WINED3D_LOCATION_DIB:
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D)
+ ERR("Invalid map binding %#x for resource type %#x.\n",
+ sub_resource->map_binding, resource->type);
+ base_memory = texture->sub_resources[sub_resource_idx].u.surface->dib.bitmap_data;
+ break;
+
+ case WINED3D_LOCATION_BUFFER:
+ GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER,
+ texture->sub_resources[sub_resource_idx].buffer_object));
+
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ GLbitfield map_flags = wined3d_resource_gl_map_flags(flags);
+ map_flags &= ~GL_MAP_FLUSH_EXPLICIT_BIT;
+ base_memory = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER,
+ 0, sub_resource->size, map_flags));
+ }
+ else
+ {
+ GLenum access = wined3d_resource_gl_legacy_map_flags(flags);
+ base_memory = GL_EXTCALL(glMapBuffer(GL_PIXEL_UNPACK_BUFFER, access));
+ }
+
+ GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
+ checkGLcall("Map PBO");
+ break;
+
+ default:
+ ERR("Unexpected map binding %s.\n", wined3d_debug_location(sub_resource->map_binding));
+ base_memory = NULL;
+ break;
+ }
+
+ if (context)
+ context_release(context);
+
+ TRACE("Base memory pointer %p.\n", base_memory);
+
+ if (fmt_flags & WINED3DFMT_FLAG_BROKEN_PITCH)
+ {
+ map_desc->row_pitch = wined3d_texture_get_level_width(texture, texture_level) * format->byte_count;
+ map_desc->slice_pitch = wined3d_texture_get_level_height(texture, texture_level) * map_desc->row_pitch;
+ }
+ else
+ {
+ wined3d_texture_get_pitch(texture, texture_level, &map_desc->row_pitch, &map_desc->slice_pitch);
+ }
+
+ if (!box)
+ {
+ map_desc->data = base_memory;
+ }
+ else
+ {
+ if ((fmt_flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS)
+ {
+ /* Compressed textures are block based, so calculate the offset of
+ * the block that contains the top-left pixel of the mapped box. */
+ map_desc->data = base_memory
+ + (box->front * map_desc->slice_pitch)
+ + ((box->top / format->block_height) * map_desc->row_pitch)
+ + ((box->left / format->block_width) * format->block_byte_count);
+ }
+ else
+ {
+ map_desc->data = base_memory
+ + (box->front * map_desc->slice_pitch)
+ + (box->top * map_desc->row_pitch)
+ + (box->left * format->byte_count);
+ }
+ }
+
+ if (texture->swapchain && texture->swapchain->front_buffer == texture)
+ {
+ RECT *r = &texture->swapchain->front_buffer_update;
+
+ if (!box)
+ SetRect(r, 0, 0, resource->width, resource->height);
+ else
+ SetRect(r, box->left, box->top, box->right, box->bottom);
+ TRACE("Mapped front buffer %s.\n", wine_dbgstr_rect(r));
+ }
+
+ ++sub_resource->map_count;
+
+ TRACE("Returning memory %p, row pitch %u, slice pitch %u.\n",
+ map_desc->data, map_desc->row_pitch, map_desc->slice_pitch);
+
+ return WINED3D_OK;
}
static HRESULT texture_resource_sub_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
@@ -1088,12 +1296,12 @@ static HRESULT texture_resource_sub_resource_unmap(struct wined3d_resource *reso
return WINED3D_OK;
}
-static const struct wined3d_resource_ops texture2d_resource_ops =
+static const struct wined3d_resource_ops texture_resource_ops =
{
texture_resource_incref,
texture_resource_decref,
wined3d_texture_unload,
- texture2d_resource_sub_resource_map,
+ texture_resource_sub_resource_map,
texture_resource_sub_resource_unmap,
};
@@ -1167,7 +1375,7 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
}
if (FAILED(hr = wined3d_texture_init(texture, &texture2d_ops, layer_count, level_count, desc,
- flags, device, parent, parent_ops, &texture2d_resource_ops)))
+ flags, device, parent, parent_ops, &texture_resource_ops)))
{
WARN("Failed to initialize texture, returning %#x.\n", hr);
return hr;
@@ -1317,6 +1525,18 @@ static void texture3d_sub_resource_upload_data(struct wined3d_resource *sub_reso
wined3d_volume_upload_data(volume, context, &addr);
}
+static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ struct wined3d_context *context, DWORD location)
+{
+ return wined3d_volume_load_location(texture->sub_resources[sub_resource_idx].u.volume, context, location);
+}
+
+static BOOL texture3d_prepare_location(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ struct wined3d_context *context, DWORD location)
+{
+ return wined3d_volume_prepare_location(texture->sub_resources[sub_resource_idx].u.volume, context, location);
+}
+
static void texture3d_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb)
{
unsigned int sub_count = texture->level_count * texture->layer_count;
@@ -1364,6 +1584,8 @@ static const struct wined3d_texture_ops texture3d_ops =
texture3d_sub_resource_invalidate_location,
texture3d_sub_resource_validate_location,
texture3d_sub_resource_upload_data,
+ texture3d_load_location,
+ texture3d_prepare_location,
texture3d_prepare_texture,
texture3d_cleanup_sub_resources,
};
@@ -1397,26 +1619,6 @@ BOOL wined3d_texture_check_block_align(const struct wined3d_texture *texture,
return TRUE;
}
-static HRESULT texture3d_resource_sub_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx,
- struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags)
-{
- struct wined3d_resource *sub_resource;
-
- if (!(sub_resource = wined3d_texture_get_sub_resource(wined3d_texture_from_resource(resource), sub_resource_idx)))
- return E_INVALIDARG;
-
- return wined3d_volume_map(volume_from_resource(sub_resource), map_desc, box, flags);
-}
-
-static const struct wined3d_resource_ops texture3d_resource_ops =
-{
- texture_resource_incref,
- texture_resource_decref,
- wined3d_texture_unload,
- texture3d_resource_sub_resource_map,
- texture_resource_sub_resource_unmap,
-};
-
static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc,
UINT levels, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops)
{
@@ -1486,7 +1688,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct
}
if (FAILED(hr = wined3d_texture_init(texture, &texture3d_ops, 1, levels, desc,
- 0, device, parent, parent_ops, &texture3d_resource_ops)))
+ 0, device, parent, parent_ops, &texture_resource_ops)))
{
WARN("Failed to initialize texture, returning %#x.\n", hr);
return hr;
diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
index 7bde024..e1749ac 100644
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c
@@ -42,7 +42,7 @@ static BOOL volume_prepare_system_memory(struct wined3d_volume *volume)
/* Context activation is done by the caller. Context may be NULL in
* WINED3D_NO3D mode. */
-static BOOL wined3d_volume_prepare_location(struct wined3d_volume *volume,
+BOOL wined3d_volume_prepare_location(struct wined3d_volume *volume,
struct wined3d_context *context, DWORD location)
{
struct wined3d_texture *texture = volume->container;
@@ -247,7 +247,7 @@ static BOOL wined3d_volume_can_evict(const struct wined3d_volume *volume)
}
/* Context activation is done by the caller. */
-static BOOL wined3d_volume_load_location(struct wined3d_volume *volume,
+BOOL wined3d_volume_load_location(struct wined3d_volume *volume,
struct wined3d_context *context, DWORD location)
{
DWORD required_access = volume_access_from_location(location);
@@ -420,165 +420,6 @@ static void volume_unload(struct wined3d_resource *resource)
resource_unload(resource);
}
-static BOOL wined3d_volume_check_box_dimensions(const struct wined3d_volume *volume,
- const struct wined3d_box *box)
-{
- if (!box)
- return TRUE;
-
- if (box->left >= box->right)
- return FALSE;
- if (box->top >= box->bottom)
- return FALSE;
- if (box->front >= box->back)
- return FALSE;
- if (box->right > volume->resource.width)
- return FALSE;
- if (box->bottom > volume->resource.height)
- return FALSE;
- if (box->back > volume->resource.depth)
- return FALSE;
-
- return TRUE;
-}
-
-HRESULT wined3d_volume_map(struct wined3d_volume *volume,
- struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags)
-{
- struct wined3d_device *device = volume->resource.device;
- struct wined3d_texture *texture = volume->container;
- struct wined3d_context *context;
- const struct wined3d_gl_info *gl_info;
- BYTE *base_memory;
- const struct wined3d_format *format = volume->resource.format;
- const unsigned int fmt_flags = texture->resource.format_flags;
- BOOL ret;
-
- TRACE("volume %p, map_desc %p, box %s, flags %#x.\n",
- volume, map_desc, debug_box(box), flags);
-
- map_desc->data = NULL;
- if (!(volume->resource.access_flags & WINED3D_RESOURCE_ACCESS_CPU))
- {
- WARN("Volume %p is not CPU accessible.\n", volume);
- return WINED3DERR_INVALIDCALL;
- }
- if (volume->resource.map_count)
- {
- WARN("Volume is already mapped.\n");
- return WINED3DERR_INVALIDCALL;
- }
- if (!wined3d_volume_check_box_dimensions(volume, box))
- {
- WARN("Map box is invalid.\n");
- return WINED3DERR_INVALIDCALL;
- }
- if ((fmt_flags & WINED3DFMT_FLAG_BLOCKS) && box
- && !wined3d_texture_check_block_align(texture, volume->texture_level, box))
- {
- WARN("Map box %s is misaligned for %ux%u blocks.\n",
- debug_box(box), format->block_width, format->block_height);
- return WINED3DERR_INVALIDCALL;
- }
-
- flags = wined3d_resource_sanitize_map_flags(&volume->resource, flags);
-
- context = context_acquire(device, NULL);
- gl_info = context->gl_info;
-
- if (flags & WINED3D_MAP_DISCARD)
- {
- wined3d_volume_validate_location(volume, volume->resource.map_binding);
- ret = wined3d_volume_prepare_location(volume, context, volume->resource.map_binding);
- }
- else
- {
- ret = wined3d_volume_load_location(volume, context, volume->resource.map_binding);
- }
-
- if (!ret)
- {
- ERR("Failed to prepare location.\n");
- context_release(context);
- map_desc->data = NULL;
- return E_OUTOFMEMORY;
- }
-
- if (volume->resource.map_binding == WINED3D_LOCATION_BUFFER)
- {
- GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, texture->sub_resources[volume->texture_level].buffer_object));
-
- if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
- {
- GLbitfield mapflags = wined3d_resource_gl_map_flags(flags);
- mapflags &= ~GL_MAP_FLUSH_EXPLICIT_BIT;
- base_memory = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER,
- 0, volume->resource.size, mapflags));
- }
- else
- {
- GLenum access = wined3d_resource_gl_legacy_map_flags(flags);
- base_memory = GL_EXTCALL(glMapBuffer(GL_PIXEL_UNPACK_BUFFER, access));
- }
-
- GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
- checkGLcall("Map PBO");
- }
- else
- {
- base_memory = volume->resource.heap_memory;
- }
-
- context_release(context);
-
- TRACE("Base memory pointer %p.\n", base_memory);
-
- if (fmt_flags & WINED3DFMT_FLAG_BROKEN_PITCH)
- {
- map_desc->row_pitch = volume->resource.width * format->byte_count;
- map_desc->slice_pitch = map_desc->row_pitch * volume->resource.height;
- }
- else
- {
- wined3d_texture_get_pitch(texture, volume->texture_level,
- &map_desc->row_pitch, &map_desc->slice_pitch);
- }
-
- if (!box)
- {
- map_desc->data = base_memory;
- }
- else
- {
- if ((fmt_flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS)
- {
- /* Compressed textures are block based, so calculate the offset of
- * the block that contains the top-left pixel of the locked rectangle. */
- map_desc->data = base_memory
- + (box->front * map_desc->slice_pitch)
- + ((box->top / format->block_height) * map_desc->row_pitch)
- + ((box->left / format->block_width) * format->block_byte_count);
- }
- else
- {
- map_desc->data = base_memory
- + (map_desc->slice_pitch * box->front)
- + (map_desc->row_pitch * box->top)
- + (box->left * volume->resource.format->byte_count);
- }
- }
-
- if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY)))
- wined3d_volume_invalidate_location(volume, ~volume->resource.map_binding);
-
- volume->resource.map_count++;
-
- TRACE("Returning memory %p, row pitch %d, slice pitch %d.\n",
- map_desc->data, map_desc->row_pitch, map_desc->slice_pitch);
-
- return WINED3D_OK;
-}
-
static ULONG volume_resource_incref(struct wined3d_resource *resource)
{
struct wined3d_volume *volume = volume_from_resource(resource);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8d64854..83a9d04 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2337,6 +2337,10 @@ struct wined3d_texture_ops
void (*texture_sub_resource_validate_location)(struct wined3d_resource *sub_resource, DWORD location);
void (*texture_sub_resource_upload_data)(struct wined3d_resource *sub_resource,
const struct wined3d_context *context, const struct wined3d_sub_resource_data *data);
+ BOOL (*texture_load_location)(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ struct wined3d_context *context, DWORD location);
+ BOOL (*texture_prepare_location)(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ struct wined3d_context *context, DWORD location);
void (*texture_prepare_texture)(struct wined3d_texture *texture,
struct wined3d_context *context, BOOL srgb);
void (*texture_cleanup_sub_resources)(struct wined3d_texture *texture);
@@ -2488,8 +2492,10 @@ HRESULT wined3d_volume_init(struct wined3d_volume *volume, struct wined3d_textur
void wined3d_volume_invalidate_location(struct wined3d_volume *volume, DWORD location) DECLSPEC_HIDDEN;
void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context,
BOOL srgb_mode) DECLSPEC_HIDDEN;
-HRESULT wined3d_volume_map(struct wined3d_volume *volume,
- struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) DECLSPEC_HIDDEN;
+BOOL wined3d_volume_load_location(struct wined3d_volume *volume,
+ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
+BOOL wined3d_volume_prepare_location(struct wined3d_volume *volume,
+ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
void wined3d_volume_validate_location(struct wined3d_volume *volume, DWORD location) DECLSPEC_HIDDEN;
void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wined3d_context *context,
const struct wined3d_const_bo_address *data) DECLSPEC_HIDDEN;
@@ -2607,8 +2613,6 @@ void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb,
struct wined3d_context *context) DECLSPEC_HIDDEN;
HRESULT surface_load_location(struct wined3d_surface *surface,
struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
-HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_desc *map_desc,
- const struct wined3d_box *box, DWORD flags) DECLSPEC_HIDDEN;
void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN;
void wined3d_surface_prepare(struct wined3d_surface *surface, struct wined3d_context *context,
DWORD location) DECLSPEC_HIDDEN;
--
2.1.4
More information about the wine-patches
mailing list