wined3d: Merge codepaths in surface_download_data().

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2016-04-19 00:01:27 +02:00 committed by Alexandre Julliard
parent 7eac961454
commit cffe58c75d
1 changed files with 104 additions and 118 deletions

View File

@ -862,7 +862,10 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
{
struct wined3d_texture *texture = surface->container;
const struct wined3d_format *format = texture->resource.format;
unsigned int dst_row_pitch, dst_slice_pitch;
unsigned int src_row_pitch, src_slice_pitch;
struct wined3d_bo_address data;
void *mem;
/* Only support read back of converted P8 surfaces. */
if (texture->flags & WINED3D_TEXTURE_CONVERTED && format->id != WINED3DFMT_P8_UINT)
@ -873,35 +876,6 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
wined3d_texture_get_memory(texture, surface_get_sub_resource_idx(surface), &data, dst_location);
if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
{
TRACE("(%p) : Calling glGetCompressedTexImage level %d, format %#x, type %#x, data %p.\n",
surface, surface->texture_level, format->glFormat, format->glType, data.addr);
if (data.buffer_object)
{
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data.buffer_object));
checkGLcall("glBindBuffer");
GL_EXTCALL(glGetCompressedTexImage(surface->texture_target, surface->texture_level, NULL));
checkGLcall("glGetCompressedTexImage");
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
checkGLcall("glBindBuffer");
}
else
{
GL_EXTCALL(glGetCompressedTexImage(surface->texture_target,
surface->texture_level, data.addr));
checkGLcall("glGetCompressedTexImage");
}
}
else
{
unsigned int dst_row_pitch, dst_slice_pitch;
unsigned int src_row_pitch, src_slice_pitch;
GLenum gl_format = format->glFormat;
GLenum gl_type = format->glType;
void *mem;
if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
{
wined3d_texture_get_pitch(texture, surface->texture_level, &dst_row_pitch, &dst_slice_pitch);
@ -910,34 +884,47 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
wined3d_texture_get_level_pow2_height(texture, surface->texture_level),
&src_row_pitch, &src_slice_pitch);
mem = HeapAlloc(GetProcessHeap(), 0, src_slice_pitch);
if (data.buffer_object)
ERR("NP2 emulated texture uses PBO unexpectedly.\n");
if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
ERR("Unexpected compressed format for NP2 emulated texture.\n");
}
else
{
mem = data.addr;
}
TRACE("(%p) : Calling glGetTexImage level %d, format %#x, type %#x, data %p\n",
surface, surface->texture_level, gl_format, gl_type, mem);
if (data.buffer_object)
{
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data.buffer_object));
checkGLcall("glBindBuffer");
}
gl_info->gl_ops.gl.p_glGetTexImage(surface->texture_target, surface->texture_level,
gl_format, gl_type, NULL);
checkGLcall("glGetTexImage");
if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
{
TRACE("Downloading compressed surface %p, level %u, format %#x, type %#x, data %p.\n",
surface, surface->texture_level, format->glFormat, format->glType, mem);
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
checkGLcall("glBindBuffer");
GL_EXTCALL(glGetCompressedTexImage(surface->texture_target, surface->texture_level, mem));
checkGLcall("glGetCompressedTexImage");
}
else
{
TRACE("Downloading surface %p, level %u, format %#x, type %#x, data %p.\n",
surface, surface->texture_level, format->glFormat, format->glType, mem);
gl_info->gl_ops.gl.p_glGetTexImage(surface->texture_target, surface->texture_level,
gl_format, gl_type, mem);
format->glFormat, format->glType, mem);
checkGLcall("glGetTexImage");
}
if (data.buffer_object)
{
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
checkGLcall("glBindBuffer");
}
if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
{
const BYTE *src_data;
@ -1001,7 +988,6 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
HeapFree(GetProcessHeap(), 0, mem);
}
}
}
/* This call just uploads data, the caller is responsible for binding the