wined3d: Merge wined3d_surface_update_desc() into wined3d_texture_update_desc().
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
bad4849257
commit
2efaddc74e
|
@ -1677,85 +1677,6 @@ static inline unsigned short float_32_to_16(const float *in)
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info)
|
||||
{
|
||||
struct wined3d_resource *texture_resource = &surface->container->resource;
|
||||
unsigned int width, height;
|
||||
BOOL create_dib = FALSE;
|
||||
DWORD valid_location = 0;
|
||||
HRESULT hr;
|
||||
|
||||
if (surface->flags & SFLAG_DIBSECTION)
|
||||
{
|
||||
DeleteDC(surface->hDC);
|
||||
DeleteObject(surface->dib.DIBsection);
|
||||
surface->dib.bitmap_data = NULL;
|
||||
surface->flags &= ~SFLAG_DIBSECTION;
|
||||
create_dib = TRUE;
|
||||
}
|
||||
|
||||
surface->locations = 0;
|
||||
wined3d_resource_free_sysmem(&surface->resource);
|
||||
|
||||
width = texture_resource->width;
|
||||
height = texture_resource->height;
|
||||
surface->resource.width = width;
|
||||
surface->resource.height = height;
|
||||
if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] || gl_info->supported[ARB_TEXTURE_RECTANGLE]
|
||||
|| gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT])
|
||||
{
|
||||
surface->pow2Width = width;
|
||||
surface->pow2Height = height;
|
||||
}
|
||||
else
|
||||
{
|
||||
surface->pow2Width = surface->pow2Height = 1;
|
||||
while (surface->pow2Width < width)
|
||||
surface->pow2Width <<= 1;
|
||||
while (surface->pow2Height < height)
|
||||
surface->pow2Height <<= 1;
|
||||
}
|
||||
|
||||
if (surface->container->user_memory)
|
||||
{
|
||||
surface->resource.map_binding = WINED3D_LOCATION_USER_MEMORY;
|
||||
valid_location = WINED3D_LOCATION_USER_MEMORY;
|
||||
}
|
||||
surface->resource.format = texture_resource->format;
|
||||
surface->resource.multisample_type = texture_resource->multisample_type;
|
||||
surface->resource.multisample_quality = texture_resource->multisample_quality;
|
||||
surface->resource.size = surface->container->slice_pitch;
|
||||
|
||||
/* The format might be changed to a format that needs conversion.
|
||||
* If the surface didn't use PBOs previously but could now, don't
|
||||
* change it - whatever made us not use PBOs might come back, e.g.
|
||||
* color keys. */
|
||||
if (surface->resource.map_binding == WINED3D_LOCATION_BUFFER
|
||||
&& !wined3d_texture_use_pbo(surface->container, gl_info))
|
||||
surface->resource.map_binding = create_dib ? WINED3D_LOCATION_DIB : WINED3D_LOCATION_SYSMEM;
|
||||
|
||||
if (create_dib)
|
||||
{
|
||||
if (FAILED(hr = surface_create_dib_section(surface)))
|
||||
{
|
||||
ERR("Failed to create dib section, hr %#x.\n", hr);
|
||||
return hr;
|
||||
}
|
||||
if (!valid_location)
|
||||
valid_location = WINED3D_LOCATION_DIB;
|
||||
}
|
||||
|
||||
if (!valid_location)
|
||||
{
|
||||
surface_prepare_system_memory(surface);
|
||||
valid_location = WINED3D_LOCATION_SYSMEM;
|
||||
}
|
||||
|
||||
surface_validate_location(surface, valid_location);
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
static void convert_r32_float_r16_float(const BYTE *src, BYTE *dst,
|
||||
DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h)
|
||||
{
|
||||
|
|
|
@ -670,6 +670,8 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
|
|||
const struct wined3d_format *format = wined3d_get_format(gl_info, format_id);
|
||||
UINT resource_size = wined3d_format_calculate_size(format, device->surface_alignment, width, height, 1);
|
||||
struct wined3d_surface *surface;
|
||||
DWORD valid_location = 0;
|
||||
BOOL create_dib = FALSE;
|
||||
|
||||
TRACE("texture %p, width %u, height %u, format %s, multisample_type %#x, multisample_quality %u, "
|
||||
"mem %p, pitch %u.\n",
|
||||
|
@ -713,13 +715,19 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
|
|||
if (device->d3d_initialized)
|
||||
texture->resource.resource_ops->resource_unload(&texture->resource);
|
||||
|
||||
texture->resource.format = format;
|
||||
texture->resource.multisample_type = multisample_type;
|
||||
texture->resource.multisample_quality = multisample_quality;
|
||||
texture->resource.width = width;
|
||||
texture->resource.height = height;
|
||||
if (surface->flags & SFLAG_DIBSECTION)
|
||||
{
|
||||
DeleteDC(surface->hDC);
|
||||
surface->hDC = NULL;
|
||||
DeleteObject(surface->dib.DIBsection);
|
||||
surface->dib.DIBsection = NULL;
|
||||
surface->dib.bitmap_data = NULL;
|
||||
surface->flags &= ~SFLAG_DIBSECTION;
|
||||
create_dib = TRUE;
|
||||
}
|
||||
|
||||
wined3d_resource_free_sysmem(&surface->resource);
|
||||
|
||||
texture->user_memory = mem;
|
||||
if ((texture->row_pitch = pitch))
|
||||
texture->slice_pitch = height * pitch;
|
||||
else
|
||||
|
@ -727,12 +735,63 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
|
|||
wined3d_format_calculate_pitch(format, 1, width, height,
|
||||
&texture->row_pitch, &texture->slice_pitch);
|
||||
|
||||
texture->flags &= ~WINED3D_TEXTURE_COND_NP2_EMULATED;
|
||||
texture->resource.format = format;
|
||||
texture->resource.multisample_type = multisample_type;
|
||||
texture->resource.multisample_quality = multisample_quality;
|
||||
texture->resource.width = width;
|
||||
texture->resource.height = height;
|
||||
|
||||
surface->resource.format = format;
|
||||
surface->resource.multisample_type = multisample_type;
|
||||
surface->resource.multisample_quality = multisample_quality;
|
||||
surface->resource.width = width;
|
||||
surface->resource.height = height;
|
||||
surface->resource.size = texture->slice_pitch;
|
||||
|
||||
if (((width & (width - 1)) || (height & (height - 1))) && !gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]
|
||||
&& !gl_info->supported[ARB_TEXTURE_RECTANGLE] && !gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT])
|
||||
{
|
||||
texture->flags |= WINED3D_TEXTURE_COND_NP2_EMULATED;
|
||||
surface->pow2Width = surface->pow2Height = 1;
|
||||
while (surface->pow2Width < width)
|
||||
surface->pow2Width <<= 1;
|
||||
while (surface->pow2Height < height)
|
||||
surface->pow2Height <<= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
texture->flags &= ~WINED3D_TEXTURE_COND_NP2_EMULATED;
|
||||
surface->pow2Width = width;
|
||||
surface->pow2Height = height;
|
||||
}
|
||||
|
||||
return wined3d_surface_update_desc(surface, gl_info);
|
||||
surface->locations = 0;
|
||||
|
||||
if ((texture->user_memory = mem))
|
||||
{
|
||||
surface->resource.map_binding = WINED3D_LOCATION_USER_MEMORY;
|
||||
valid_location = WINED3D_LOCATION_USER_MEMORY;
|
||||
}
|
||||
else if (create_dib && SUCCEEDED(surface_create_dib_section(surface)))
|
||||
{
|
||||
valid_location = WINED3D_LOCATION_DIB;
|
||||
}
|
||||
else
|
||||
{
|
||||
wined3d_surface_prepare(surface, NULL, WINED3D_LOCATION_SYSMEM);
|
||||
valid_location = WINED3D_LOCATION_SYSMEM;
|
||||
}
|
||||
|
||||
/* The format might be changed to a format that needs conversion.
|
||||
* If the surface didn't use PBOs previously but could now, don't
|
||||
* change it - whatever made us not use PBOs might come back, e.g.
|
||||
* color keys. */
|
||||
if (surface->resource.map_binding == WINED3D_LOCATION_BUFFER && !wined3d_texture_use_pbo(texture, gl_info))
|
||||
surface->resource.map_binding = surface->dib.DIBsection ? WINED3D_LOCATION_DIB : WINED3D_LOCATION_SYSMEM;
|
||||
|
||||
surface_validate_location(surface, valid_location);
|
||||
|
||||
return WINED3D_OK;
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
|
|
|
@ -2623,8 +2623,6 @@ void surface_set_compatible_renderbuffer(struct wined3d_surface *surface,
|
|||
void surface_set_dirty(struct wined3d_surface *surface) DECLSPEC_HIDDEN;
|
||||
void surface_set_texture_target(struct wined3d_surface *surface, GLenum target, GLint level) DECLSPEC_HIDDEN;
|
||||
void surface_translate_drawable_coords(const struct wined3d_surface *surface, HWND window, RECT *rect) DECLSPEC_HIDDEN;
|
||||
HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface,
|
||||
const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
|
||||
HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point,
|
||||
struct wined3d_surface *src_surface, const RECT *src_rect) DECLSPEC_HIDDEN;
|
||||
void surface_validate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN;
|
||||
|
|
Loading…
Reference in New Issue