Commit 1c840bb1 by Maxime Gregoire Committed by Maxime Grégoire

OpenGL ES environment texture partial implementation

Change-Id: I0dcce9f2659cfdde8cc4d5a0a541bea7728b3f97 Reviewed-on: https://swiftshader-review.googlesource.com/1850Tested-by: 's avatarMaxime Grégoire <mgregoire@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 4b8df2f5
...@@ -103,6 +103,8 @@ Context::Context(const egl::Config *config, const Context *shareContext) ...@@ -103,6 +103,8 @@ Context::Context(const egl::Config *config, const Context *shareContext)
mState.colorMaskAlpha = true; mState.colorMaskAlpha = true;
mState.depthMask = true; mState.depthMask = true;
mState.textureEnvMode = GL_MODULATE;
if(shareContext != NULL) if(shareContext != NULL)
{ {
mResourceManager = shareContext->mResourceManager; mResourceManager = shareContext->mResourceManager;
...@@ -1757,7 +1759,9 @@ GLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode ...@@ -1757,7 +1759,9 @@ GLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode
void Context::applyTextures() void Context::applyTextures()
{ {
for(int samplerIndex = 0; samplerIndex < MAX_TEXTURE_UNITS; samplerIndex++) GLenum texEnvMode = getTextureEnvMode();
for(int samplerIndex = 0; samplerIndex < MAX_TEXTURE_UNITS; samplerIndex++)
{ {
Texture *texture = getSamplerTexture(samplerIndex, TEXTURE_2D); Texture *texture = getSamplerTexture(samplerIndex, TEXTURE_2D);
...@@ -1784,29 +1788,57 @@ void Context::applyTextures() ...@@ -1784,29 +1788,57 @@ void Context::applyTextures()
applyTexture(samplerIndex, texture); applyTexture(samplerIndex, texture);
device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_MODULATE); GLenum texFormat = texture->getFormat(GL_TEXTURE_2D, 0);
device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_TEXTURE); sw::TextureStage::StageOperation rgbOperation, alphaOperation;
device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT); es2sw::ConvertTextureOperations(texEnvMode, texFormat, &rgbOperation, &alphaOperation);
device->setStageOperationAlpha(samplerIndex, sw::TextureStage::STAGE_MODULATE); device->setStageOperation(samplerIndex, rgbOperation);
device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_TEXTURE); device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_TEXTURE);
device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT); device->setFirstModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);
device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);
device->setSecondModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);
device->setStageOperationAlpha(samplerIndex, alphaOperation);
device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_TEXTURE);
device->setFirstModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);
device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);
device->setSecondModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);
} }
else else
{ {
applyTexture(samplerIndex, 0); applyTexture(samplerIndex, 0);
device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_SELECTARG1);
device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT); device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);
device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT); device->setFirstModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);
device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);
device->setSecondModifier(samplerIndex, sw::TextureStage::MODIFIER_COLOR);
device->setStageOperationAlpha(samplerIndex, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperationAlpha(samplerIndex, sw::TextureStage::STAGE_SELECTARG1);
device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT); device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);
device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT); device->setFirstModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);
device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT);
device->setSecondModifierAlpha(samplerIndex, sw::TextureStage::MODIFIER_ALPHA);
} }
} }
} }
void Context::setTextureEnvMode(GLenum texEnvMode)
{
switch(texEnvMode)
{
case GL_MODULATE:
case GL_DECAL:
case GL_BLEND:
case GL_ADD:
case GL_REPLACE:
mState.textureEnvMode = texEnvMode;
break;
default:
UNREACHABLE();
}
}
void Context::applyTexture(int index, Texture *baseTexture) void Context::applyTexture(int index, Texture *baseTexture)
{ {
sw::Resource *resource = 0; sw::Resource *resource = 0;
...@@ -2633,6 +2665,11 @@ unsigned int Context::getActiveTexture() const ...@@ -2633,6 +2665,11 @@ unsigned int Context::getActiveTexture() const
return mState.activeSampler; return mState.activeSampler;
} }
GLenum Context::getTextureEnvMode()
{
return mState.textureEnvMode;
}
} }
// Exported functions for use by EGL // Exported functions for use by EGL
......
...@@ -252,6 +252,8 @@ struct State ...@@ -252,6 +252,8 @@ struct State
GLint unpackAlignment; GLint unpackAlignment;
GLint packAlignment; GLint packAlignment;
GLenum textureEnvMode;
}; };
class Context : public egl::Context class Context : public egl::Context
...@@ -326,6 +328,9 @@ public: ...@@ -326,6 +328,9 @@ public:
GLenum getClientActiveTexture() const; GLenum getClientActiveTexture() const;
unsigned int getActiveTexture() const; unsigned int getActiveTexture() const;
void setTextureEnvMode(GLenum texEnvMode);
GLenum getTextureEnvMode();
void setLineWidth(GLfloat width); void setLineWidth(GLfloat width);
void setGenerateMipmapHint(GLenum hint); void setGenerateMipmapHint(GLenum hint);
......
...@@ -3269,7 +3269,85 @@ void GL_APIENTRY glTexCoordPointer(GLint size, GLenum type, GLsizei stride, cons ...@@ -3269,7 +3269,85 @@ void GL_APIENTRY glTexCoordPointer(GLint size, GLenum type, GLsizei stride, cons
void GL_APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param) void GL_APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param)
{ {
UNIMPLEMENTED(); es1::Context *context = es1::getContext();
if(context)
{
switch(target)
{
case GL_POINT_SPRITE_OES:
UNIMPLEMENTED();
break;
case GL_TEXTURE_ENV:
switch(pname)
{
case GL_TEXTURE_ENV_MODE:
switch((GLenum)param)
{
case GL_REPLACE:
case GL_MODULATE:
case GL_DECAL:
case GL_BLEND:
case GL_ADD:
case GL_COMBINE:
break;
default:
error(GL_INVALID_ENUM);
}
context->setTextureEnvMode((GLenum)param);
break;
case GL_TEXTURE_ENV_COLOR:
UNIMPLEMENTED();
break;
case GL_COMBINE_RGB:
switch((GLenum)param)
{
case GL_REPLACE:
UNIMPLEMENTED();
break;
case GL_MODULATE:
UNIMPLEMENTED();
break;
case GL_ADD:
context->setTextureEnvMode((GLenum)param);
break;
case GL_ADD_SIGNED:
UNIMPLEMENTED();
break;
case GL_INTERPOLATE:
UNIMPLEMENTED();
break;
case GL_SUBTRACT:
UNIMPLEMENTED();
break;
case GL_DOT3_RGB:
UNIMPLEMENTED();
break;
case GL_DOT3_RGBA:
UNIMPLEMENTED();
break;
default:
error(GL_INVALID_ENUM);
}
break;
case GL_COMBINE_ALPHA:
UNIMPLEMENTED();
break;
case GL_RGB_SCALE:
UNIMPLEMENTED();
break;
case GL_ALPHA_SCALE:
UNIMPLEMENTED();
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
}
}
} }
void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
...@@ -3279,7 +3357,7 @@ void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) ...@@ -3279,7 +3357,7 @@ void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
void GL_APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param) void GL_APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param)
{ {
UNIMPLEMENTED(); glTexEnvf(target, pname, (float)param);
} }
void GL_APIENTRY glTexEnvx(GLenum target, GLenum pname, GLfixed param) void GL_APIENTRY glTexEnvx(GLenum target, GLenum pname, GLfixed param)
......
...@@ -467,6 +467,59 @@ namespace es2sw ...@@ -467,6 +467,59 @@ namespace es2sw
default: UNREACHABLE(); return sw::FORMAT_A8R8G8B8; default: UNREACHABLE(); return sw::FORMAT_A8R8G8B8;
} }
} }
void ConvertTextureOperations(GLenum texEnvMode, GLenum texFormat, sw::TextureStage::StageOperation *rgbOperation, sw::TextureStage::StageOperation *alphaOperation)
{
switch(texEnvMode)
{
case GL_MODULATE:
switch(texFormat)
{
case GL_LUMINANCE_ALPHA:
*rgbOperation = sw::TextureStage::STAGE_MODULATE;
*alphaOperation = sw::TextureStage::STAGE_MODULATE;
break;
case GL_RGB:
*rgbOperation = sw::TextureStage::STAGE_MODULATE;
*alphaOperation = sw::TextureStage::STAGE_SELECTARG2;
break;
case GL_RGBA:
*rgbOperation = sw::TextureStage::STAGE_MODULATE;
*alphaOperation = sw::TextureStage::STAGE_MODULATE;
break;
case GL_ALPHA:
case GL_LUMINANCE:
UNIMPLEMENTED();
// Default operations for compatibility
*rgbOperation = sw::TextureStage::STAGE_MODULATE;
*alphaOperation = sw::TextureStage::STAGE_MODULATE;
break;
default: UNREACHABLE();
}
break;
case GL_REPLACE:
*rgbOperation = sw::TextureStage::STAGE_SELECTARG1;
*alphaOperation = sw::TextureStage::STAGE_SELECTARG1;
break;
case GL_ADD:
*rgbOperation = sw::TextureStage::STAGE_ADD;
*alphaOperation = sw::TextureStage::STAGE_SELECTARG1;
break;
case GL_DECAL:
case GL_BLEND:
// Default operations for compatibility
*rgbOperation = sw::TextureStage::STAGE_MODULATE;
*alphaOperation = sw::TextureStage::STAGE_MODULATE;
UNIMPLEMENTED();
break;
default:
UNREACHABLE();
}
}
} }
namespace sw2es namespace sw2es
......
...@@ -61,6 +61,7 @@ namespace es2sw ...@@ -61,6 +61,7 @@ namespace es2sw
void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy); void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy);
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es1::PrimitiveType &swPrimitiveType, int &primitiveCount); bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es1::PrimitiveType &swPrimitiveType, int &primitiveCount);
sw::Format ConvertRenderbufferFormat(GLenum format); sw::Format ConvertRenderbufferFormat(GLenum format);
void ConvertTextureOperations(GLenum texOperation, GLenum texFormat, sw::TextureStage::StageOperation *rgbOperation, sw::TextureStage::StageOperation *alphaOperation);
} }
namespace sw2es namespace sw2es
......
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