Commit bc90a480 by Geoff Lang

Added TEXTURE_SWIZZLE_* parameters to the texture sampler state and API queries.

Change-Id: I20aff392ec4cd9e49424afae94a862fdd8eef9b8 Reviewed-on: https://chromium-review.googlesource.com/177030Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Commit-Queue: Shannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarShannon Woods <shannonwoods@chromium.org>
parent ed883f54
......@@ -62,6 +62,10 @@ Texture::Texture(rx::Renderer *renderer, GLuint id, GLenum target) : RefCountObj
mSamplerState.lodOffset = 0;
mSamplerState.compareMode = GL_NONE;
mSamplerState.compareFunc = GL_LEQUAL;
mSamplerState.swizzleRed = GL_RED;
mSamplerState.swizzleGreen = GL_GREEN;
mSamplerState.swizzleBlue = GL_BLUE;
mSamplerState.swizzleAlpha = GL_ALPHA;
mUsage = GL_NONE;
mDirtyImages = true;
......@@ -130,6 +134,26 @@ void Texture::setCompareFunc(GLenum func)
mSamplerState.compareFunc = func;
}
void Texture::setSwizzleRed(GLenum swizzle)
{
mSamplerState.swizzleRed = swizzle;
}
void Texture::setSwizzleGreen(GLenum swizzle)
{
mSamplerState.swizzleGreen = swizzle;
}
void Texture::setSwizzleBlue(GLenum swizzle)
{
mSamplerState.swizzleBlue = swizzle;
}
void Texture::setSwizzleAlpha(GLenum swizzle)
{
mSamplerState.swizzleAlpha = swizzle;
}
void Texture::setUsage(GLenum usage)
{
mUsage = usage;
......@@ -165,6 +189,34 @@ float Texture::getMaxAnisotropy() const
return mSamplerState.maxAnisotropy;
}
GLenum Texture::getSwizzleRed() const
{
return mSamplerState.swizzleRed;
}
GLenum Texture::getSwizzleGreen() const
{
return mSamplerState.swizzleGreen;
}
GLenum Texture::getSwizzleBlue() const
{
return mSamplerState.swizzleBlue;
}
GLenum Texture::getSwizzleAlpha() const
{
return mSamplerState.swizzleAlpha;
}
bool Texture::isSwizzled() const
{
return mSamplerState.swizzleRed != GL_RED ||
mSamplerState.swizzleGreen != GL_GREEN ||
mSamplerState.swizzleBlue != GL_BLUE ||
mSamplerState.swizzleAlpha != GL_ALPHA;
}
int Texture::getLodOffset()
{
rx::TextureStorageInterface *texture = getNativeTexture();
......
......@@ -77,6 +77,10 @@ class Texture : public RefCountObject
void setMaxAnisotropy(float textureMaxAnisotropy, float contextMaxAnisotropy);
void setCompareMode(GLenum mode);
void setCompareFunc(GLenum func);
void setSwizzleRed(GLenum swizzle);
void setSwizzleGreen(GLenum swizzle);
void setSwizzleBlue(GLenum swizzle);
void setSwizzleAlpha(GLenum swizzle);
void setUsage(GLenum usage);
GLenum getMinFilter() const;
......@@ -85,6 +89,11 @@ class Texture : public RefCountObject
GLenum getWrapT() const;
GLenum getWrapR() const;
float getMaxAnisotropy() const;
GLenum getSwizzleRed() const;
GLenum getSwizzleGreen() const;
GLenum getSwizzleBlue() const;
GLenum getSwizzleAlpha() const;
bool isSwizzled() const;
int getLodOffset();
void getSamplerState(SamplerState *sampler);
GLenum getUsage() const;
......
......@@ -152,6 +152,11 @@ struct SamplerState
GLenum compareMode;
GLenum compareFunc;
GLenum swizzleRed;
GLenum swizzleGreen;
GLenum swizzleBlue;
GLenum swizzleAlpha;
};
struct ClearParameters
......
......@@ -3751,6 +3751,34 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
}
*params = (GLfloat)texture->getMaxAnisotropy();
break;
case GL_TEXTURE_SWIZZLE_R:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLfloat)texture->getSwizzleRed();
break;
case GL_TEXTURE_SWIZZLE_G:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLfloat)texture->getSwizzleGreen();
break;
case GL_TEXTURE_SWIZZLE_B:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLfloat)texture->getSwizzleBlue();
break;
case GL_TEXTURE_SWIZZLE_A:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = (GLfloat)texture->getSwizzleAlpha();
break;
default:
return gl::error(GL_INVALID_ENUM);
}
......@@ -3821,6 +3849,34 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
}
*params = (GLint)texture->getMaxAnisotropy();
break;
case GL_TEXTURE_SWIZZLE_R:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getSwizzleRed();
break;
case GL_TEXTURE_SWIZZLE_G:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getSwizzleGreen();
break;
case GL_TEXTURE_SWIZZLE_B:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getSwizzleBlue();
break;
case GL_TEXTURE_SWIZZLE_A:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = texture->getSwizzleAlpha();
break;
default:
return gl::error(GL_INVALID_ENUM);
......@@ -5181,11 +5237,11 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(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_SWIZZLE_R:
case GL_TEXTURE_SWIZZLE_G:
case GL_TEXTURE_SWIZZLE_B:
case GL_TEXTURE_SWIZZLE_A:
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
case GL_TEXTURE_MIN_LOD:
......@@ -5241,11 +5297,11 @@ void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((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_A: texture->setSwizzleAlpha((GLenum)param); break;
case GL_TEXTURE_SWIZZLE_R:
case GL_TEXTURE_SWIZZLE_G:
case GL_TEXTURE_SWIZZLE_B:
case GL_TEXTURE_SWIZZLE_A:
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
case GL_TEXTURE_MIN_LOD:
......
......@@ -575,6 +575,20 @@ bool ValidateTexParamParameters(gl::Context *context, GLenum pname, GLint param)
case GL_TEXTURE_SWIZZLE_G:
case GL_TEXTURE_SWIZZLE_B:
case GL_TEXTURE_SWIZZLE_A:
switch (param)
{
case GL_RED:
case GL_GREEN:
case GL_BLUE:
case GL_ALPHA:
case GL_ZERO:
case GL_ONE:
return true;
default:
return gl::error(GL_INVALID_ENUM, false);
}
break;
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
UNIMPLEMENTED();
......
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