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) ...@@ -30,13 +30,15 @@ Sampler::Sampler(GLuint id)
void Sampler::getState(SamplerState *samplerState) const void Sampler::getState(SamplerState *samplerState) const
{ {
samplerState->minFilter = mMinFilter; samplerState->minFilter = mMinFilter;
samplerState->magFilter = mMagFilter; samplerState->magFilter = mMagFilter;
samplerState->wrapS = mWrapS; samplerState->wrapS = mWrapS;
samplerState->wrapT = mWrapT; samplerState->wrapT = mWrapT;
samplerState->wrapR = mWrapR; samplerState->wrapR = mWrapR;
samplerState->minLod = mMinLod;
// TODO: comparison mode/func, min/max LOD samplerState->maxLod = mMaxLod;
samplerState->compareMode = mComparisonMode;
samplerState->compareFunc = mComparisonFunc;
} }
} }
...@@ -59,7 +59,10 @@ Texture::Texture(rx::Renderer *renderer, GLuint id, GLenum target) : RefCountObj ...@@ -59,7 +59,10 @@ Texture::Texture(rx::Renderer *renderer, GLuint id, GLenum target) : RefCountObj
mSamplerState.wrapT = GL_REPEAT; mSamplerState.wrapT = GL_REPEAT;
mSamplerState.wrapR = GL_REPEAT; mSamplerState.wrapR = GL_REPEAT;
mSamplerState.maxAnisotropy = 1.0f; 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.compareMode = GL_NONE;
mSamplerState.compareFunc = GL_LEQUAL; mSamplerState.compareFunc = GL_LEQUAL;
mSamplerState.swizzleRed = GL_RED; mSamplerState.swizzleRed = GL_RED;
...@@ -154,6 +157,26 @@ void Texture::setSwizzleAlpha(GLenum swizzle) ...@@ -154,6 +157,26 @@ void Texture::setSwizzleAlpha(GLenum swizzle)
mSamplerState.swizzleAlpha = 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) void Texture::setUsage(GLenum usage)
{ {
mUsage = usage; mUsage = usage;
...@@ -209,6 +232,26 @@ GLenum Texture::getSwizzleAlpha() const ...@@ -209,6 +232,26 @@ GLenum Texture::getSwizzleAlpha() const
return mSamplerState.swizzleAlpha; 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 bool Texture::isSwizzled() const
{ {
return mSamplerState.swizzleRed != GL_RED || return mSamplerState.swizzleRed != GL_RED ||
...@@ -217,16 +260,14 @@ bool Texture::isSwizzled() const ...@@ -217,16 +260,14 @@ bool Texture::isSwizzled() const
mSamplerState.swizzleAlpha != GL_ALPHA; mSamplerState.swizzleAlpha != GL_ALPHA;
} }
int Texture::getTopLevel()
{
rx::TextureStorageInterface *texture = getNativeTexture();
return texture ? texture->getTopLevel() : 0;
}
void Texture::getSamplerState(SamplerState *sampler) void Texture::getSamplerState(SamplerState *sampler)
{ {
*sampler = mSamplerState; *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 GLenum Texture::getUsage() const
......
...@@ -83,6 +83,10 @@ class Texture : public RefCountObject ...@@ -83,6 +83,10 @@ class Texture : public RefCountObject
void setSwizzleGreen(GLenum swizzle); void setSwizzleGreen(GLenum swizzle);
void setSwizzleBlue(GLenum swizzle); void setSwizzleBlue(GLenum swizzle);
void setSwizzleAlpha(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); void setUsage(GLenum usage);
GLenum getMinFilter() const; GLenum getMinFilter() const;
...@@ -95,8 +99,11 @@ class Texture : public RefCountObject ...@@ -95,8 +99,11 @@ class Texture : public RefCountObject
GLenum getSwizzleGreen() const; GLenum getSwizzleGreen() const;
GLenum getSwizzleBlue() const; GLenum getSwizzleBlue() const;
GLenum getSwizzleAlpha() const; GLenum getSwizzleAlpha() const;
GLint getBaseLevel() const;
GLint getMaxLevel() const;
GLfloat getMinLod() const;
GLfloat getMaxLod() const;
bool isSwizzled() const; bool isSwizzled() const;
int getTopLevel();
void getSamplerState(SamplerState *sampler); void getSamplerState(SamplerState *sampler);
GLenum getUsage() const; GLenum getUsage() const;
......
...@@ -153,7 +153,11 @@ struct SamplerState ...@@ -153,7 +153,11 @@ struct SamplerState
GLenum wrapT; GLenum wrapT;
GLenum wrapR; GLenum wrapR;
float maxAnisotropy; float maxAnisotropy;
int lodOffset;
GLint baseLevel;
GLint maxLevel;
GLfloat minLod;
GLfloat maxLod;
GLenum compareMode; GLenum compareMode;
GLenum compareFunc; GLenum compareFunc;
......
...@@ -3546,6 +3546,34 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) ...@@ -3546,6 +3546,34 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
} }
*params = (GLfloat)texture->getSwizzleAlpha(); *params = (GLfloat)texture->getSwizzleAlpha();
break; 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: default:
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
...@@ -3644,7 +3672,34 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) ...@@ -3644,7 +3672,34 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
} }
*params = texture->getSwizzleAlpha(); *params = texture->getSwizzleAlpha();
break; 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: default:
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
...@@ -4963,21 +5018,17 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param) ...@@ -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_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(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_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_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(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_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(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_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break; case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
case GL_TEXTURE_MAX_LEVEL: case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
case GL_TEXTURE_MIN_LOD: case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
case GL_TEXTURE_MAX_LOD:
UNIMPLEMENTED();
break;
default: UNREACHABLE(); break; default: UNREACHABLE(); break;
} }
} }
...@@ -5030,14 +5081,10 @@ void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param) ...@@ -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_G: texture->setSwizzleGreen((GLenum)param); break;
case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((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_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
case GL_TEXTURE_MAX_LEVEL: case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
case GL_TEXTURE_MIN_LOD: case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
case GL_TEXTURE_MAX_LOD:
UNIMPLEMENTED();
break;
default: UNREACHABLE(); break; default: UNREACHABLE(); break;
} }
} }
......
...@@ -791,7 +791,7 @@ void Renderer9::setSamplerState(gl::SamplerType type, int index, const gl::Sampl ...@@ -791,7 +791,7 @@ void Renderer9::setSamplerState(gl::SamplerType type, int index, const gl::Sampl
gl_d3d9::ConvertMinFilter(samplerState.minFilter, &d3dMinFilter, &d3dMipFilter, samplerState.maxAnisotropy); gl_d3d9::ConvertMinFilter(samplerState.minFilter, &d3dMinFilter, &d3dMipFilter, samplerState.maxAnisotropy);
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MINFILTER, d3dMinFilter); mDevice->SetSamplerState(d3dSampler, D3DSAMP_MINFILTER, d3dMinFilter);
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MIPFILTER, d3dMipFilter); mDevice->SetSamplerState(d3dSampler, D3DSAMP_MIPFILTER, d3dMipFilter);
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXMIPLEVEL, samplerState.lodOffset); mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXMIPLEVEL, samplerState.baseLevel);
if (mSupportsTextureFilterAnisotropy) if (mSupportsTextureFilterAnisotropy)
{ {
mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXANISOTROPY, (DWORD)samplerState.maxAnisotropy); mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXANISOTROPY, (DWORD)samplerState.maxAnisotropy);
......
...@@ -790,7 +790,10 @@ bool ValidateTexParamParameters(gl::Context *context, GLenum pname, GLint param) ...@@ -790,7 +790,10 @@ bool ValidateTexParamParameters(gl::Context *context, GLenum pname, GLint param)
case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL: case GL_TEXTURE_MAX_LEVEL:
UNIMPLEMENTED(); if (param < 0)
{
return gl::error(GL_INVALID_VALUE, false);
}
return true; return true;
default: 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