Commit 8de68287 by Nicolas Capens

Implement state tracking for BASE/MAX_LEVEL, and MIN/MAX_LOD.

BUG=angle:596 Change-Id: I773720a19b766c7a6930967983db0a34e84f2790 Reviewed-on: https://chromium-review.googlesource.com/193235Tested-by: 's avatarNicolas Capens <nicolascapens@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 41d9f7e9
......@@ -30,13 +30,15 @@ Sampler::Sampler(GLuint id)
void Sampler::getState(SamplerState *samplerState) const
{
samplerState->minFilter = mMinFilter;
samplerState->magFilter = mMagFilter;
samplerState->wrapS = mWrapS;
samplerState->wrapT = mWrapT;
samplerState->wrapR = mWrapR;
// TODO: comparison mode/func, min/max LOD
samplerState->minFilter = mMinFilter;
samplerState->magFilter = mMagFilter;
samplerState->wrapS = mWrapS;
samplerState->wrapT = mWrapT;
samplerState->wrapR = mWrapR;
samplerState->minLod = mMinLod;
samplerState->maxLod = mMaxLod;
samplerState->compareMode = mComparisonMode;
samplerState->compareFunc = mComparisonFunc;
}
}
......@@ -59,7 +59,10 @@ Texture::Texture(rx::Renderer *renderer, GLuint id, GLenum target) : RefCountObj
mSamplerState.wrapT = GL_REPEAT;
mSamplerState.wrapR = GL_REPEAT;
mSamplerState.maxAnisotropy = 1.0f;
mSamplerState.lodOffset = 0;
mSamplerState.baseLevel = 0;
mSamplerState.maxLevel = 1000;
mSamplerState.minLod = -1000.0f;
mSamplerState.maxLod = 1000.0f;
mSamplerState.compareMode = GL_NONE;
mSamplerState.compareFunc = GL_LEQUAL;
mSamplerState.swizzleRed = GL_RED;
......@@ -154,6 +157,26 @@ void Texture::setSwizzleAlpha(GLenum swizzle)
mSamplerState.swizzleAlpha = swizzle;
}
void Texture::setBaseLevel(GLint baseLevel)
{
mSamplerState.baseLevel = baseLevel;
}
void Texture::setMaxLevel(GLint maxLevel)
{
mSamplerState.maxLevel = maxLevel;
}
void Texture::setMinLod(GLfloat minLod)
{
mSamplerState.minLod = minLod;
}
void Texture::setMaxLod(GLfloat maxLod)
{
mSamplerState.maxLod = maxLod;
}
void Texture::setUsage(GLenum usage)
{
mUsage = usage;
......@@ -209,6 +232,26 @@ GLenum Texture::getSwizzleAlpha() const
return mSamplerState.swizzleAlpha;
}
GLint Texture::getBaseLevel() const
{
return mSamplerState.baseLevel;
}
GLint Texture::getMaxLevel() const
{
return mSamplerState.maxLevel;
}
GLfloat Texture::getMinLod() const
{
return mSamplerState.minLod;
}
GLfloat Texture::getMaxLod() const
{
return mSamplerState.maxLod;
}
bool Texture::isSwizzled() const
{
return mSamplerState.swizzleRed != GL_RED ||
......@@ -217,16 +260,14 @@ bool Texture::isSwizzled() const
mSamplerState.swizzleAlpha != GL_ALPHA;
}
int Texture::getTopLevel()
{
rx::TextureStorageInterface *texture = getNativeTexture();
return texture ? texture->getTopLevel() : 0;
}
void Texture::getSamplerState(SamplerState *sampler)
{
*sampler = mSamplerState;
sampler->lodOffset = getTopLevel();
// Offset the effective base level by the texture storage's top level
rx::TextureStorageInterface *texture = getNativeTexture();
int topLevel = texture ? texture->getTopLevel() : 0;
sampler->baseLevel = topLevel + mSamplerState.baseLevel;
}
GLenum Texture::getUsage() const
......
......@@ -83,6 +83,10 @@ class Texture : public RefCountObject
void setSwizzleGreen(GLenum swizzle);
void setSwizzleBlue(GLenum swizzle);
void setSwizzleAlpha(GLenum swizzle);
void setBaseLevel(GLint baseLevel);
void setMaxLevel(GLint maxLevel);
void setMinLod(GLfloat minLod);
void setMaxLod(GLfloat maxLod);
void setUsage(GLenum usage);
GLenum getMinFilter() const;
......@@ -95,8 +99,11 @@ class Texture : public RefCountObject
GLenum getSwizzleGreen() const;
GLenum getSwizzleBlue() const;
GLenum getSwizzleAlpha() const;
GLint getBaseLevel() const;
GLint getMaxLevel() const;
GLfloat getMinLod() const;
GLfloat getMaxLod() const;
bool isSwizzled() const;
int getTopLevel();
void getSamplerState(SamplerState *sampler);
GLenum getUsage() const;
......
......@@ -153,7 +153,11 @@ struct SamplerState
GLenum wrapT;
GLenum wrapR;
float maxAnisotropy;
int lodOffset;
GLint baseLevel;
GLint maxLevel;
GLfloat minLod;
GLfloat maxLod;
GLenum compareMode;
GLenum compareFunc;
......
......@@ -3546,6 +3546,34 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
}
*params = (GLfloat)texture->getSwizzleAlpha();
break;
case GL_TEXTURE_BASE_LEVEL:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLfloat)texture->getBaseLevel();
break;
case GL_TEXTURE_MAX_LEVEL:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLfloat)texture->getMaxLevel();
break;
case GL_TEXTURE_MIN_LOD:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getMinLod();
break;
case GL_TEXTURE_MAX_LOD:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getMaxLod();
break;
default:
return gl::error(GL_INVALID_ENUM);
}
......@@ -3644,7 +3672,34 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
}
*params = texture->getSwizzleAlpha();
break;
case GL_TEXTURE_BASE_LEVEL:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getBaseLevel();
break;
case GL_TEXTURE_MAX_LEVEL:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getMaxLevel();
break;
case GL_TEXTURE_MIN_LOD:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLint)texture->getMinLod();
break;
case GL_TEXTURE_MAX_LOD:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLint)texture->getMaxLod();
break;
default:
return gl::error(GL_INVALID_ENUM);
}
......@@ -4963,21 +5018,17 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getTextureMaxAnisotropy()); break;
case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
case GL_TEXTURE_MIN_LOD:
case GL_TEXTURE_MAX_LOD:
UNIMPLEMENTED();
break;
case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
default: UNREACHABLE(); break;
}
}
......@@ -5030,14 +5081,10 @@ void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
case GL_TEXTURE_MIN_LOD:
case GL_TEXTURE_MAX_LOD:
UNIMPLEMENTED();
break;
case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
default: UNREACHABLE(); break;
}
}
......
......@@ -791,7 +791,7 @@ void Renderer9::setSamplerState(gl::SamplerType type, int index, const gl::Sampl
gl_d3d9::ConvertMinFilter(samplerState.minFilter, &d3dMinFilter, &d3dMipFilter, samplerState.maxAnisotropy);
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MINFILTER, d3dMinFilter);
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MIPFILTER, d3dMipFilter);
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXMIPLEVEL, samplerState.lodOffset);
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXMIPLEVEL, samplerState.baseLevel);
if (mSupportsTextureFilterAnisotropy)
{
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXANISOTROPY, (DWORD)samplerState.maxAnisotropy);
......
......@@ -790,7 +790,10 @@ bool ValidateTexParamParameters(gl::Context *context, GLenum pname, GLint param)
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
UNIMPLEMENTED();
if (param < 0)
{
return gl::error(GL_INVALID_VALUE, false);
}
return true;
default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment