wined3d: Introduce wined3d_texture_get_memory().

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Stefan Dösinger 2016-03-31 22:48:54 +02:00 committed by Alexandre Julliard
parent e50ff74808
commit a2c5afe61e
3 changed files with 85 additions and 82 deletions

View File

@ -454,39 +454,6 @@ HRESULT surface_create_dib_section(struct wined3d_surface *surface)
return WINED3D_OK;
}
static void surface_get_memory(const struct wined3d_surface *surface, struct wined3d_bo_address *data,
DWORD location)
{
if (location & WINED3D_LOCATION_BUFFER)
{
data->addr = NULL;
data->buffer_object = surface->container->sub_resources[surface_get_sub_resource_idx(surface)].buffer_object;
return;
}
if (location & WINED3D_LOCATION_USER_MEMORY)
{
data->addr = surface->container->user_memory;
data->buffer_object = 0;
return;
}
if (location & WINED3D_LOCATION_DIB)
{
data->addr = surface->dib.bitmap_data;
data->buffer_object = 0;
return;
}
if (location & WINED3D_LOCATION_SYSMEM)
{
data->addr = surface->resource.heap_memory;
data->buffer_object = 0;
return;
}
ERR("Unexpected locations %s.\n", wined3d_debug_location(location));
data->addr = NULL;
data->buffer_object = 0;
}
static void surface_prepare_system_memory(struct wined3d_surface *surface)
{
TRACE("surface %p.\n", surface);
@ -1013,7 +980,7 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
return;
}
surface_get_memory(surface, &data, dst_location);
wined3d_texture_get_memory(texture, surface_get_sub_resource_idx(surface), &data, dst_location);
if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
{
@ -1268,6 +1235,7 @@ static BOOL surface_check_block_align_rect(struct wined3d_surface *surface, cons
HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point,
struct wined3d_surface *src_surface, const RECT *src_rect)
{
unsigned int src_sub_resource_idx = surface_get_sub_resource_idx(src_surface);
unsigned int dst_sub_resource_idx = surface_get_sub_resource_idx(dst_surface);
struct wined3d_texture *src_texture = src_surface->container;
struct wined3d_texture *dst_texture = dst_surface->container;
@ -1364,7 +1332,8 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P
surface_load_location(dst_surface, context, WINED3D_LOCATION_TEXTURE_RGB);
wined3d_texture_bind_and_dirtify(dst_texture, context, FALSE);
surface_get_memory(src_surface, &data, surface_get_sub_resource(src_surface)->locations);
wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &data,
src_texture->sub_resources[src_sub_resource_idx].locations);
wined3d_texture_get_pitch(src_texture, src_surface->texture_level, &src_row_pitch, &src_slice_pitch);
wined3d_surface_upload_data(dst_surface, gl_info, src_format, src_rect,
@ -1844,6 +1813,7 @@ do { \
static void read_from_framebuffer(struct wined3d_surface *surface,
struct wined3d_context *old_ctx, DWORD dst_location)
{
unsigned int sub_resource_idx = surface_get_sub_resource_idx(surface);
struct wined3d_texture *texture = surface->container;
struct wined3d_device *device = texture->resource.device;
const struct wined3d_gl_info *gl_info;
@ -1856,7 +1826,7 @@ static void read_from_framebuffer(struct wined3d_surface *surface,
BOOL srcIsUpsideDown;
struct wined3d_bo_address data;
surface_get_memory(surface, &data, dst_location);
wined3d_texture_get_memory(texture, sub_resource_idx, &data, dst_location);
restore_rt = context_get_rt_surface(old_ctx);
if (restore_rt != surface)
@ -2943,14 +2913,17 @@ static DWORD resource_access_from_location(DWORD location)
static void surface_copy_simple_location(struct wined3d_surface *surface, DWORD location)
{
struct wined3d_device *device = surface->container->resource.device;
unsigned int sub_resource_idx = surface_get_sub_resource_idx(surface);
struct wined3d_texture *texture = surface->container;
struct wined3d_device *device = texture->resource.device;
struct wined3d_context *context;
const struct wined3d_gl_info *gl_info;
struct wined3d_bo_address dst, src;
UINT size = surface->resource.size;
surface_get_memory(surface, &dst, location);
surface_get_memory(surface, &src, surface_get_sub_resource(surface)->locations);
wined3d_texture_get_memory(texture, sub_resource_idx, &dst, location);
wined3d_texture_get_memory(texture, sub_resource_idx, &src,
texture->sub_resources[sub_resource_idx].locations);
if (dst.buffer_object)
{
@ -3046,6 +3019,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
{
unsigned int width, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch;
const RECT src_rect = {0, 0, surface->resource.width, surface->resource.height};
unsigned int sub_resource_idx = surface_get_sub_resource_idx(surface);
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_texture *texture = surface->container;
struct wined3d_device *device = texture->resource.device;
@ -3142,8 +3116,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
/* Don't use PBOs for converted surfaces. During PBO conversion we look at
* WINED3D_TEXTURE_CONVERTED but it isn't set (yet) in all cases it is
* getting called. */
if ((format.convert || conversion)
&& texture->sub_resources[surface_get_sub_resource_idx(surface)].buffer_object)
if ((format.convert || conversion) && texture->sub_resources[sub_resource_idx].buffer_object)
{
TRACE("Removing the pbo attached to surface %p.\n", surface);
@ -3153,10 +3126,10 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
surface->resource.map_binding = WINED3D_LOCATION_SYSMEM;
surface_load_location(surface, context, surface->resource.map_binding);
wined3d_texture_remove_buffer_object(texture, surface_get_sub_resource_idx(surface), gl_info);
wined3d_texture_remove_buffer_object(texture, sub_resource_idx, gl_info);
}
surface_get_memory(surface, &data, sub_resource->locations);
wined3d_texture_get_memory(texture, sub_resource_idx, &data, sub_resource->locations);
if (format.convert)
{
/* This code is entered for texture formats which need a fixup. */

View File

@ -104,6 +104,50 @@ void wined3d_texture_invalidate_location(struct wined3d_texture *texture,
sub_resource_idx, texture);
}
void wined3d_texture_get_memory(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_bo_address *data, DWORD locations)
{
struct wined3d_texture_sub_resource *sub_resource;
TRACE("texture %p, sub_resource_idx %u, data %p, locations %s.\n",
texture, sub_resource_idx, data, wined3d_debug_location(locations));
sub_resource = &texture->sub_resources[sub_resource_idx];
if (locations & WINED3D_LOCATION_BUFFER)
{
data->addr = NULL;
data->buffer_object = sub_resource->buffer_object;
return;
}
if (locations & WINED3D_LOCATION_USER_MEMORY)
{
data->addr = texture->user_memory;
data->buffer_object = 0;
return;
}
if (locations & WINED3D_LOCATION_DIB)
{
if (texture->resource.type == WINED3D_RTYPE_TEXTURE_2D)
{
data->addr = sub_resource->u.surface->dib.bitmap_data;
data->buffer_object = 0;
return;
}
ERR("Invalid location WINED3D_LOCATION_DIB for resource type %s.\n",
debug_d3dresourcetype(texture->resource.type));
}
if (locations & WINED3D_LOCATION_SYSMEM)
{
data->addr = sub_resource->resource->heap_memory;
data->buffer_object = 0;
return;
}
ERR("Unexpected locations %s.\n", wined3d_debug_location(locations));
data->addr = NULL;
data->buffer_object = 0;
}
static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struct wined3d_texture_ops *texture_ops,
UINT layer_count, UINT level_count, const struct wined3d_resource_desc *desc, DWORD flags,
struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops,
@ -1215,6 +1259,7 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
struct wined3d_context *context = NULL;
struct wined3d_resource *sub_resource;
struct wined3d_texture *texture;
struct wined3d_bo_address data;
unsigned int texture_level;
BYTE *base_memory;
BOOL ret;
@ -1290,48 +1335,31 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY)))
wined3d_texture_invalidate_location(texture, sub_resource_idx, ~sub_resource->map_binding);
switch (sub_resource->map_binding)
wined3d_texture_get_memory(texture, sub_resource_idx, &data, sub_resource->map_binding);
if (!data.buffer_object)
{
case WINED3D_LOCATION_SYSMEM:
base_memory = sub_resource->heap_memory;
break;
base_memory = data.addr;
}
else
{
GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, data.buffer_object));
case WINED3D_LOCATION_USER_MEMORY:
base_memory = texture->user_memory;
break;
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,
(INT_PTR)data.addr, 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));
base_memory += (INT_PTR)data.addr;
}
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;
GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
checkGLcall("Map PBO");
}
if (context)

View File

@ -2484,6 +2484,8 @@ void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture,
BOOL wined3d_texture_check_block_align(const struct wined3d_texture *texture,
unsigned int level, const struct wined3d_box *box) DECLSPEC_HIDDEN;
GLenum wined3d_texture_get_gl_buffer(const struct wined3d_texture *texture) DECLSPEC_HIDDEN;
void wined3d_texture_get_memory(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_bo_address *data, DWORD locations) DECLSPEC_HIDDEN;
struct wined3d_resource *wined3d_texture_get_sub_resource(const struct wined3d_texture *texture,
UINT sub_resource_idx) DECLSPEC_HIDDEN;
void wined3d_texture_invalidate_location(struct wined3d_texture *texture,