wined3d: Refuse to create NPOT textures without GL support.
This commit is contained in:
parent
37169522f6
commit
c6ed62735d
|
@ -2,7 +2,7 @@
|
||||||
* Copyright 2002-2005 Jason Edmeades
|
* Copyright 2002-2005 Jason Edmeades
|
||||||
* Copyright 2002-2005 Raphael Junqueira
|
* Copyright 2002-2005 Raphael Junqueira
|
||||||
* Copyright 2005 Oliver Stieber
|
* Copyright 2005 Oliver Stieber
|
||||||
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
|
* Copyright 2007-2009, 2013 Stefan Dösinger for CodeWeavers
|
||||||
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
|
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
@ -760,7 +760,6 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, UINT edge_lengt
|
||||||
{
|
{
|
||||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||||
const struct wined3d_format *format = wined3d_get_format(gl_info, format_id);
|
const struct wined3d_format *format = wined3d_get_format(gl_info, format_id);
|
||||||
UINT pow2_edge_length;
|
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
UINT tmp_w;
|
UINT tmp_w;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -802,6 +801,27 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, UINT edge_lengt
|
||||||
TRACE("Calculated levels = %u.\n", levels);
|
TRACE("Calculated levels = %u.\n", levels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
|
||||||
|
{
|
||||||
|
UINT pow2_edge_length = 1;
|
||||||
|
while (pow2_edge_length < edge_length) pow2_edge_length <<= 1;
|
||||||
|
|
||||||
|
if (edge_length != pow2_edge_length)
|
||||||
|
{
|
||||||
|
if (pool == WINED3D_POOL_SCRATCH)
|
||||||
|
{
|
||||||
|
/* SCRATCH textures cannot be used for texturing */
|
||||||
|
WARN("Creating a scratch NPOT cube texture despite lack of HW support.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("Attempted to create a NPOT cube texture (edge_length=%u) without GL support.\n",
|
||||||
|
edge_length);
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hr = wined3d_texture_init(texture, &texture2d_ops, 6, levels,
|
hr = wined3d_texture_init(texture, &texture2d_ops, 6, levels,
|
||||||
WINED3D_RTYPE_CUBE_TEXTURE, device, usage, format, pool,
|
WINED3D_RTYPE_CUBE_TEXTURE, device, usage, format, pool,
|
||||||
parent, parent_ops, &texture2d_resource_ops);
|
parent, parent_ops, &texture2d_resource_ops);
|
||||||
|
@ -811,27 +831,10 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, UINT edge_lengt
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the nearest pow2 match. */
|
texture->pow2_matrix[0] = 1.0f;
|
||||||
pow2_edge_length = 1;
|
texture->pow2_matrix[5] = 1.0f;
|
||||||
while (pow2_edge_length < edge_length) pow2_edge_length <<= 1;
|
texture->pow2_matrix[10] = 1.0f;
|
||||||
|
texture->pow2_matrix[15] = 1.0f;
|
||||||
if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] || (edge_length == pow2_edge_length))
|
|
||||||
{
|
|
||||||
/* Precalculated scaling for 'faked' non power of two texture coords. */
|
|
||||||
texture->pow2_matrix[0] = 1.0f;
|
|
||||||
texture->pow2_matrix[5] = 1.0f;
|
|
||||||
texture->pow2_matrix[10] = 1.0f;
|
|
||||||
texture->pow2_matrix[15] = 1.0f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Precalculated scaling for 'faked' non power of two texture coords. */
|
|
||||||
texture->pow2_matrix[0] = ((float)edge_length) / ((float)pow2_edge_length);
|
|
||||||
texture->pow2_matrix[5] = ((float)edge_length) / ((float)pow2_edge_length);
|
|
||||||
texture->pow2_matrix[10] = ((float)edge_length) / ((float)pow2_edge_length);
|
|
||||||
texture->pow2_matrix[15] = 1.0f;
|
|
||||||
texture->flags &= ~WINED3D_TEXTURE_POW2_MAT_IDENT;
|
|
||||||
}
|
|
||||||
texture->target = GL_TEXTURE_CUBE_MAP_ARB;
|
texture->target = GL_TEXTURE_CUBE_MAP_ARB;
|
||||||
|
|
||||||
/* Generate all the surfaces. */
|
/* Generate all the surfaces. */
|
||||||
|
@ -906,12 +909,19 @@ static HRESULT texture_init(struct wined3d_texture *texture, UINT width, UINT he
|
||||||
|
|
||||||
if (pow2_width != width || pow2_height != height)
|
if (pow2_width != width || pow2_height != height)
|
||||||
{
|
{
|
||||||
if (levels > 1)
|
/* levels == 0 returns an error as well */
|
||||||
|
if (levels != 1)
|
||||||
{
|
{
|
||||||
WARN("Attempted to create a mipmapped np2 texture without unconditional np2 support.\n");
|
if (pool == WINED3D_POOL_SCRATCH)
|
||||||
return WINED3DERR_INVALIDCALL;
|
{
|
||||||
|
WARN("Creating a scratch mipmapped NPOT texture despite lack of HW support.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("Attempted to create a mipmapped NPOT texture without unconditional NPOT support.\n");
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
levels = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1186,6 +1196,31 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, UINT width, U
|
||||||
TRACE("Calculated levels = %u.\n", levels);
|
TRACE("Calculated levels = %u.\n", levels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
|
||||||
|
{
|
||||||
|
UINT pow2_w, pow2_h, pow2_d;
|
||||||
|
pow2_w = 1;
|
||||||
|
while (pow2_w < width) pow2_w <<= 1;
|
||||||
|
pow2_h = 1;
|
||||||
|
while (pow2_h < height) pow2_h <<= 1;
|
||||||
|
pow2_d = 1;
|
||||||
|
while (pow2_d < depth) pow2_d <<= 1;
|
||||||
|
|
||||||
|
if (pow2_w != width || pow2_h != height || pow2_d != depth)
|
||||||
|
{
|
||||||
|
if (pool == WINED3D_POOL_SCRATCH)
|
||||||
|
{
|
||||||
|
WARN("Creating a scratch NPOT volume texture despite lack of HW support.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("Attempted to create a NPOT volume texture (%u,%u,%u) without GL support.\n",
|
||||||
|
width, height, depth);
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hr = wined3d_texture_init(texture, &texture3d_ops, 1, levels,
|
hr = wined3d_texture_init(texture, &texture3d_ops, 1, levels,
|
||||||
WINED3D_RTYPE_VOLUME_TEXTURE, device, usage, format, pool,
|
WINED3D_RTYPE_VOLUME_TEXTURE, device, usage, format, pool,
|
||||||
parent, parent_ops, &texture3d_resource_ops);
|
parent, parent_ops, &texture3d_resource_ops);
|
||||||
|
@ -1195,7 +1230,6 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, UINT width, U
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is NP2 support for volumes needed? */
|
|
||||||
texture->pow2_matrix[0] = 1.0f;
|
texture->pow2_matrix[0] = 1.0f;
|
||||||
texture->pow2_matrix[5] = 1.0f;
|
texture->pow2_matrix[5] = 1.0f;
|
||||||
texture->pow2_matrix[10] = 1.0f;
|
texture->pow2_matrix[10] = 1.0f;
|
||||||
|
|
Loading…
Reference in New Issue