wined3d: Factor out wined3d_texture_gl_upload_bo() function.
Signed-off-by: Paul Gofman <gofmanp@gmail.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3f7fdcfd63
commit
7474d665be
|
@ -1845,6 +1845,124 @@ HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture,
|
|||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
static void wined3d_texture_gl_upload_bo(const struct wined3d_format *src_format, GLenum target,
|
||||
unsigned int level, unsigned int src_row_pitch, unsigned int dst_x, unsigned int dst_y,
|
||||
unsigned int dst_z, unsigned int update_w, unsigned int update_h, unsigned int update_d,
|
||||
const BYTE *addr, BOOL srgb, struct wined3d_texture *dst_texture,
|
||||
const struct wined3d_gl_info *gl_info)
|
||||
{
|
||||
const struct wined3d_format_gl *format_gl = wined3d_format_gl(src_format);
|
||||
|
||||
if (src_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_COMPRESSED)
|
||||
{
|
||||
unsigned int dst_row_pitch, dst_slice_pitch;
|
||||
GLenum internal;
|
||||
|
||||
if (srgb)
|
||||
internal = format_gl->srgb_internal;
|
||||
else if (dst_texture->resource.bind_flags & WINED3D_BIND_RENDER_TARGET
|
||||
&& wined3d_resource_is_offscreen(&dst_texture->resource))
|
||||
internal = format_gl->rt_internal;
|
||||
else
|
||||
internal = format_gl->internal;
|
||||
|
||||
wined3d_format_calculate_pitch(src_format, 1, update_w, update_h, &dst_row_pitch, &dst_slice_pitch);
|
||||
|
||||
TRACE("Uploading compressed data, target %#x, level %u, x %u, y %u, z %u, "
|
||||
"w %u, h %u, d %u, format %#x, image_size %#x, addr %p.\n",
|
||||
target, level, dst_x, dst_y, dst_z, update_w, update_h,
|
||||
update_d, internal, dst_slice_pitch, addr);
|
||||
|
||||
if (target == GL_TEXTURE_1D)
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage1D(target, level, dst_x,
|
||||
update_w, internal, dst_row_pitch, addr));
|
||||
}
|
||||
else if (dst_row_pitch == src_row_pitch)
|
||||
{
|
||||
if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_3D)
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage3D(target, level, dst_x, dst_y, dst_z,
|
||||
update_w, update_h, update_d, internal, dst_slice_pitch * update_d, addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage2D(target, level, dst_x, dst_y,
|
||||
update_w, update_h, internal, dst_slice_pitch, addr));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int row_count = (update_h + src_format->block_height - 1) / src_format->block_height;
|
||||
unsigned int row, y, z;
|
||||
|
||||
/* glCompressedTexSubImage2D() ignores pixel store state, so we
|
||||
* can't use the unpack row length like for glTexSubImage2D. */
|
||||
for (z = dst_z; z < dst_z + update_d; ++z)
|
||||
{
|
||||
for (row = 0, y = dst_y; row < row_count; ++row)
|
||||
{
|
||||
if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_3D)
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage3D(target, level, dst_x, y, z,
|
||||
update_w, src_format->block_height, 1, internal, dst_row_pitch, addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage2D(target, level, dst_x, y,
|
||||
update_w, src_format->block_height, internal, dst_row_pitch, addr));
|
||||
}
|
||||
|
||||
y += src_format->block_height;
|
||||
addr += src_row_pitch;
|
||||
}
|
||||
}
|
||||
}
|
||||
checkGLcall("Upload compressed texture data");
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int y, y_count;
|
||||
|
||||
TRACE("Uploading data, target %#x, level %u, x %u, y %u, z %u, "
|
||||
"w %u, h %u, d %u, format %#x, type %#x, addr %p.\n",
|
||||
target, level, dst_x, dst_y, dst_z, update_w, update_h,
|
||||
update_d, format_gl->format, format_gl->type, addr);
|
||||
|
||||
if (src_row_pitch)
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, src_row_pitch / src_format->byte_count);
|
||||
y_count = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
y_count = update_h;
|
||||
update_h = 1;
|
||||
}
|
||||
|
||||
for (y = 0; y < y_count; ++y)
|
||||
{
|
||||
if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_3D)
|
||||
{
|
||||
GL_EXTCALL(glTexSubImage3D(target, level, dst_x, dst_y + y, dst_z,
|
||||
update_w, update_h, update_d, format_gl->format, format_gl->type, addr));
|
||||
}
|
||||
else if (target == GL_TEXTURE_1D)
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glTexSubImage1D(target, level, dst_x,
|
||||
update_w, format_gl->format, format_gl->type, addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glTexSubImage2D(target, level, dst_x, dst_y + y,
|
||||
update_w, update_h, format_gl->format, format_gl->type, addr);
|
||||
}
|
||||
}
|
||||
gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
checkGLcall("Upload texture data");
|
||||
}
|
||||
}
|
||||
|
||||
static void wined3d_texture_gl_upload_data(struct wined3d_context *context,
|
||||
const struct wined3d_const_bo_address *src_bo_addr, const struct wined3d_format *src_format,
|
||||
const struct wined3d_box *src_box, unsigned int src_row_pitch, unsigned int src_slice_pitch,
|
||||
|
@ -1856,7 +1974,6 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context,
|
|||
unsigned int update_w = src_box->right - src_box->left;
|
||||
unsigned int update_h = src_box->bottom - src_box->top;
|
||||
unsigned int update_d = src_box->back - src_box->front;
|
||||
const struct wined3d_format_gl *format_gl;
|
||||
struct wined3d_bo_address bo;
|
||||
void *converted_mem = NULL;
|
||||
struct wined3d_format_gl f;
|
||||
|
@ -1981,116 +2098,8 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context,
|
|||
checkGLcall("glBindBuffer");
|
||||
}
|
||||
|
||||
format_gl = wined3d_format_gl(src_format);
|
||||
if (src_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_COMPRESSED)
|
||||
{
|
||||
unsigned int dst_row_pitch, dst_slice_pitch;
|
||||
const BYTE *addr = bo.addr;
|
||||
GLenum internal;
|
||||
|
||||
if (srgb)
|
||||
internal = format_gl->srgb_internal;
|
||||
else if (dst_texture->resource.bind_flags & WINED3D_BIND_RENDER_TARGET
|
||||
&& wined3d_resource_is_offscreen(&dst_texture->resource))
|
||||
internal = format_gl->rt_internal;
|
||||
else
|
||||
internal = format_gl->internal;
|
||||
|
||||
wined3d_format_calculate_pitch(src_format, 1, update_w, update_h, &dst_row_pitch, &dst_slice_pitch);
|
||||
|
||||
TRACE("Uploading compressed data, target %#x, level %u, x %u, y %u, z %u, "
|
||||
"w %u, h %u, d %u, format %#x, image_size %#x, addr %p.\n",
|
||||
target, level, dst_x, dst_y, dst_z, update_w, update_h,
|
||||
update_d, internal, dst_slice_pitch, addr);
|
||||
|
||||
if (target == GL_TEXTURE_1D)
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage1D(target, level, dst_x,
|
||||
update_w, internal, dst_row_pitch, addr));
|
||||
}
|
||||
else if (dst_row_pitch == src_row_pitch)
|
||||
{
|
||||
if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_3D)
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage3D(target, level, dst_x, dst_y, dst_z,
|
||||
update_w, update_h, update_d, internal, dst_slice_pitch * update_d, addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage2D(target, level, dst_x, dst_y,
|
||||
update_w, update_h, internal, dst_slice_pitch, addr));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int row_count = (update_h + src_format->block_height - 1) / src_format->block_height;
|
||||
unsigned int row, y, z;
|
||||
|
||||
/* glCompressedTexSubImage2D() ignores pixel store state, so we
|
||||
* can't use the unpack row length like for glTexSubImage2D. */
|
||||
for (z = dst_z; z < dst_z + update_d; ++z)
|
||||
{
|
||||
for (row = 0, y = dst_y; row < row_count; ++row)
|
||||
{
|
||||
if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_3D)
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage3D(target, level, dst_x, y, z,
|
||||
update_w, src_format->block_height, 1, internal, dst_row_pitch, addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_EXTCALL(glCompressedTexSubImage2D(target, level, dst_x, y,
|
||||
update_w, src_format->block_height, internal, dst_row_pitch, addr));
|
||||
}
|
||||
|
||||
y += src_format->block_height;
|
||||
addr += src_row_pitch;
|
||||
}
|
||||
}
|
||||
}
|
||||
checkGLcall("Upload compressed texture data");
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int y, y_count;
|
||||
|
||||
TRACE("Uploading data, target %#x, level %u, x %u, y %u, z %u, "
|
||||
"w %u, h %u, d %u, format %#x, type %#x, addr %p.\n",
|
||||
target, level, dst_x, dst_y, dst_z, update_w, update_h,
|
||||
update_d, format_gl->format, format_gl->type, bo.addr);
|
||||
|
||||
if (src_row_pitch)
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, src_row_pitch / src_format->byte_count);
|
||||
y_count = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
y_count = update_h;
|
||||
update_h = 1;
|
||||
}
|
||||
|
||||
for (y = 0; y < y_count; ++y)
|
||||
{
|
||||
if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_3D)
|
||||
{
|
||||
GL_EXTCALL(glTexSubImage3D(target, level, dst_x, dst_y + y, dst_z,
|
||||
update_w, update_h, update_d, format_gl->format, format_gl->type, bo.addr));
|
||||
}
|
||||
else if (target == GL_TEXTURE_1D)
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glTexSubImage1D(target, level, dst_x,
|
||||
update_w, format_gl->format, format_gl->type, bo.addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glTexSubImage2D(target, level, dst_x, dst_y + y,
|
||||
update_w, update_h, format_gl->format, format_gl->type, bo.addr);
|
||||
}
|
||||
}
|
||||
gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
checkGLcall("Upload texture data");
|
||||
}
|
||||
wined3d_texture_gl_upload_bo(src_format, target, level, src_row_pitch, dst_x, dst_y,
|
||||
dst_z, update_w, update_h, update_d, bo.addr, srgb, dst_texture, gl_info);
|
||||
|
||||
if (bo.buffer_object)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue