Commit f6c1d96d by Nicolas Capens

Implement texture environment src, operand, and color.

Change-Id: I8c683a783f0a7f8a82206de77ae9d139f4b1bb10 Reviewed-on: https://swiftshader-review.googlesource.com/3762Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent d15c3ea9
...@@ -111,6 +111,7 @@ Context::Context(const egl::Config *config, const Context *shareContext) ...@@ -111,6 +111,7 @@ Context::Context(const egl::Config *config, const Context *shareContext)
for(int i = 0; i < MAX_TEXTURE_UNITS; i++) for(int i = 0; i < MAX_TEXTURE_UNITS; i++)
{ {
mState.textureUnit[i].color = {0, 0, 0, 0};
mState.textureUnit[i].environmentMode = GL_MODULATE; mState.textureUnit[i].environmentMode = GL_MODULATE;
mState.textureUnit[i].combineRGB = GL_MODULATE; mState.textureUnit[i].combineRGB = GL_MODULATE;
mState.textureUnit[i].combineAlpha = GL_MODULATE; mState.textureUnit[i].combineAlpha = GL_MODULATE;
...@@ -1938,6 +1939,8 @@ void Context::applyTextures() ...@@ -1938,6 +1939,8 @@ void Context::applyTextures()
applyTexture(unit, texture); applyTexture(unit, texture);
device->setConstantColor(unit, sw::Color<float>(mState.textureUnit[unit].color.red, mState.textureUnit[unit].color.green, mState.textureUnit[unit].color.blue, mState.textureUnit[unit].color.alpha));
if(mState.textureUnit[unit].environmentMode != GL_COMBINE) if(mState.textureUnit[unit].environmentMode != GL_COMBINE)
{ {
device->setFirstArgument(unit, sw::TextureStage::SOURCE_TEXTURE); // Cs device->setFirstArgument(unit, sw::TextureStage::SOURCE_TEXTURE); // Cs
...@@ -2110,6 +2113,11 @@ void Context::setTextureEnvMode(GLenum texEnvMode) ...@@ -2110,6 +2113,11 @@ void Context::setTextureEnvMode(GLenum texEnvMode)
mState.textureUnit[mState.activeSampler].environmentMode = texEnvMode; mState.textureUnit[mState.activeSampler].environmentMode = texEnvMode;
} }
void Context::setTextureEnvColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
mState.textureUnit[mState.activeSampler].color = {red, green, blue, alpha};
}
void Context::setCombineRGB(GLenum combineRGB) void Context::setCombineRGB(GLenum combineRGB)
{ {
mState.textureUnit[mState.activeSampler].combineRGB = combineRGB; mState.textureUnit[mState.activeSampler].combineRGB = combineRGB;
...@@ -2120,6 +2128,66 @@ void Context::setCombineAlpha(GLenum combineAlpha) ...@@ -2120,6 +2128,66 @@ void Context::setCombineAlpha(GLenum combineAlpha)
mState.textureUnit[mState.activeSampler].combineAlpha = combineAlpha; mState.textureUnit[mState.activeSampler].combineAlpha = combineAlpha;
} }
void Context::setOperand0RGB(GLenum operand)
{
mState.textureUnit[mState.activeSampler].operand0RGB = operand;
}
void Context::setOperand1RGB(GLenum operand)
{
mState.textureUnit[mState.activeSampler].operand1RGB = operand;
}
void Context::setOperand2RGB(GLenum operand)
{
mState.textureUnit[mState.activeSampler].operand2RGB = operand;
}
void Context::setOperand0Alpha(GLenum operand)
{
mState.textureUnit[mState.activeSampler].operand0Alpha = operand;
}
void Context::setOperand1Alpha(GLenum operand)
{
mState.textureUnit[mState.activeSampler].operand1Alpha = operand;
}
void Context::setOperand2Alpha(GLenum operand)
{
mState.textureUnit[mState.activeSampler].operand2Alpha = operand;
}
void Context::setSrc0RGB(GLenum src)
{
mState.textureUnit[mState.activeSampler].src0RGB = src;
}
void Context::setSrc1RGB(GLenum src)
{
mState.textureUnit[mState.activeSampler].src1RGB = src;
}
void Context::setSrc2RGB(GLenum src)
{
mState.textureUnit[mState.activeSampler].src2RGB = src;
}
void Context::setSrc0Alpha(GLenum src)
{
mState.textureUnit[mState.activeSampler].src0Alpha = src;
}
void Context::setSrc1Alpha(GLenum src)
{
mState.textureUnit[mState.activeSampler].src1Alpha = src;
}
void Context::setSrc2Alpha(GLenum src)
{
mState.textureUnit[mState.activeSampler].src2Alpha = src;
}
void Context::applyTexture(int index, Texture *baseTexture) void Context::applyTexture(int index, Texture *baseTexture)
{ {
sw::Resource *resource = 0; sw::Resource *resource = 0;
......
...@@ -182,6 +182,7 @@ typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS]; ...@@ -182,6 +182,7 @@ typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS];
struct TextureUnit struct TextureUnit
{ {
Color color;
GLenum environmentMode; GLenum environmentMode;
GLenum combineRGB; GLenum combineRGB;
GLenum combineAlpha; GLenum combineAlpha;
...@@ -362,8 +363,21 @@ public: ...@@ -362,8 +363,21 @@ public:
unsigned int getActiveTexture() const; unsigned int getActiveTexture() const;
void setTextureEnvMode(GLenum texEnvMode); void setTextureEnvMode(GLenum texEnvMode);
void setTextureEnvColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
void setCombineRGB(GLenum combineRGB); void setCombineRGB(GLenum combineRGB);
void setCombineAlpha(GLenum combineAlpha); void setCombineAlpha(GLenum combineAlpha);
void setOperand0RGB(GLenum operand);
void setOperand1RGB(GLenum operand);
void setOperand2RGB(GLenum operand);
void setOperand0Alpha(GLenum operand);
void setOperand1Alpha(GLenum operand);
void setOperand2Alpha(GLenum operand);
void setSrc0RGB(GLenum src);
void setSrc1RGB(GLenum src);
void setSrc2RGB(GLenum src);
void setSrc0Alpha(GLenum src);
void setSrc1Alpha(GLenum src);
void setSrc2Alpha(GLenum src);
void setLineWidth(GLfloat width); void setLineWidth(GLfloat width);
......
...@@ -3193,11 +3193,265 @@ void TexEnvf(GLenum target, GLenum pname, GLfloat param) ...@@ -3193,11 +3193,265 @@ void TexEnvf(GLenum target, GLenum pname, GLfloat param)
void TexEnvfv(GLenum target, GLenum pname, const GLfloat *params) void TexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
{ {
UNIMPLEMENTED(); TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, const GLfloat *params)", target, pname);
es1::Context *context = es1::getContext();
if(context)
{
GLint iParam = (GLint)roundf(params[0]);
switch(target)
{
case GL_POINT_SPRITE_OES:
UNIMPLEMENTED();
break;
case GL_TEXTURE_ENV:
switch(pname)
{
case GL_TEXTURE_ENV_MODE:
switch(iParam)
{
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(iParam);
break;
case GL_TEXTURE_ENV_COLOR:
context->setTextureEnvColor(clamp01(params[0]), clamp01(params[1]), clamp01(params[2]), clamp01(params[3]));
break;
case GL_COMBINE_RGB:
switch(iParam)
{
case GL_REPLACE:
case GL_MODULATE:
case GL_ADD:
case GL_ADD_SIGNED:
case GL_INTERPOLATE:
case GL_SUBTRACT:
case GL_DOT3_RGB:
case GL_DOT3_RGBA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setCombineRGB(iParam);
break;
case GL_COMBINE_ALPHA:
switch(iParam)
{
case GL_REPLACE:
case GL_MODULATE:
case GL_ADD:
case GL_ADD_SIGNED:
case GL_INTERPOLATE:
case GL_SUBTRACT:
break;
default:
error(GL_INVALID_ENUM);
}
context->setCombineAlpha(iParam);
break;
case GL_RGB_SCALE:
if(iParam != 1 && iParam != 2 && iParam != 4)
{
return error(GL_INVALID_VALUE);
}
if(iParam != 1) UNIMPLEMENTED();
break;
case GL_ALPHA_SCALE:
if(iParam != 1 && iParam != 2 && iParam != 4)
{
return error(GL_INVALID_VALUE);
}
if(iParam != 1) UNIMPLEMENTED();
break;
case GL_OPERAND0_RGB:
switch(iParam)
{
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand0RGB(iParam);
break;
case GL_OPERAND1_RGB:
switch(iParam)
{
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand1RGB(iParam);
break;
case GL_OPERAND2_RGB:
switch(iParam)
{
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand2RGB(iParam);
break;
case GL_OPERAND0_ALPHA:
switch(iParam)
{
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand0Alpha(iParam);
break;
case GL_OPERAND1_ALPHA:
switch(iParam)
{
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand1Alpha(iParam);
break;
case GL_OPERAND2_ALPHA:
switch(iParam)
{
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand2Alpha(iParam);
break;
case GL_SRC0_RGB:
switch(iParam)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc0RGB(iParam);
break;
case GL_SRC1_RGB:
switch(iParam)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc1RGB(iParam);
break;
case GL_SRC2_RGB:
switch(iParam)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc2RGB(iParam);
break;
case GL_SRC0_ALPHA:
switch(iParam)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc0Alpha(iParam);
break;
case GL_SRC1_ALPHA:
switch(iParam)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc1Alpha(iParam);
break;
case GL_SRC2_ALPHA:
switch(iParam)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc2Alpha(iParam);
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_ENUM);
}
}
} }
void TexEnvi(GLenum target, GLenum pname, GLint param) void TexEnvi(GLenum target, GLenum pname, GLint param)
{ {
TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
es1::Context *context = es1::getContext(); es1::Context *context = es1::getContext();
if(context) if(context)
...@@ -3227,7 +3481,7 @@ void TexEnvi(GLenum target, GLenum pname, GLint param) ...@@ -3227,7 +3481,7 @@ void TexEnvi(GLenum target, GLenum pname, GLint param)
context->setTextureEnvMode((GLenum)param); context->setTextureEnvMode((GLenum)param);
break; break;
case GL_TEXTURE_ENV_COLOR: case GL_TEXTURE_ENV_COLOR:
UNIMPLEMENTED(); return error(GL_INVALID_ENUM); // Needs four values, should call glTexEnviv() instead
break; break;
case GL_COMBINE_RGB: case GL_COMBINE_RGB:
switch((GLenum)param) switch((GLenum)param)
...@@ -3264,28 +3518,180 @@ void TexEnvi(GLenum target, GLenum pname, GLint param) ...@@ -3264,28 +3518,180 @@ void TexEnvi(GLenum target, GLenum pname, GLint param)
context->setCombineAlpha((GLenum)param); context->setCombineAlpha((GLenum)param);
break; break;
case GL_RGB_SCALE: case GL_RGB_SCALE:
UNIMPLEMENTED(); if(param != 1 && param != 2 && param != 4)
{
return error(GL_INVALID_VALUE);
}
if(param != 1) UNIMPLEMENTED();
break; break;
case GL_ALPHA_SCALE: case GL_ALPHA_SCALE:
UNIMPLEMENTED(); if(param != 1 && param != 2 && param != 4)
{
return error(GL_INVALID_VALUE);
}
if(param != 1) UNIMPLEMENTED();
break; break;
case GL_OPERAND0_RGB: case GL_OPERAND0_RGB:
UNIMPLEMENTED(); switch((GLenum)param)
{
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand0RGB((GLenum)param);
break; break;
case GL_OPERAND1_RGB: case GL_OPERAND1_RGB:
UNIMPLEMENTED(); switch((GLenum)param)
{
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand1RGB((GLenum)param);
break; break;
case GL_OPERAND2_RGB: case GL_OPERAND2_RGB:
UNIMPLEMENTED(); switch((GLenum)param)
{
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand2RGB((GLenum)param);
break; break;
case GL_OPERAND0_ALPHA: case GL_OPERAND0_ALPHA:
UNIMPLEMENTED(); switch((GLenum)param)
{
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand0Alpha((GLenum)param);
break; break;
case GL_OPERAND1_ALPHA: case GL_OPERAND1_ALPHA:
UNIMPLEMENTED(); switch((GLenum)param)
{
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand1Alpha((GLenum)param);
break; break;
case GL_OPERAND2_ALPHA: case GL_OPERAND2_ALPHA:
UNIMPLEMENTED(); switch((GLenum)param)
{
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
break;
default:
error(GL_INVALID_ENUM);
}
context->setOperand2Alpha((GLenum)param);
break;
case GL_SRC0_RGB:
switch((GLenum)param)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc0RGB((GLenum)param);
break;
case GL_SRC1_RGB:
switch((GLenum)param)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc1RGB((GLenum)param);
break;
case GL_SRC2_RGB:
switch((GLenum)param)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc2RGB((GLenum)param);
break;
case GL_SRC0_ALPHA:
switch((GLenum)param)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc0Alpha((GLenum)param);
break;
case GL_SRC1_ALPHA:
switch((GLenum)param)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc1Alpha((GLenum)param);
break;
case GL_SRC2_ALPHA:
switch((GLenum)param)
{
case GL_TEXTURE:
case GL_CONSTANT:
case GL_PRIMARY_COLOR:
case GL_PREVIOUS:
break;
default:
error(GL_INVALID_ENUM);
}
context->setSrc2Alpha((GLenum)param);
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -3779,7 +4185,7 @@ void DrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height) ...@@ -3779,7 +4185,7 @@ void DrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height)
if(context) if(context)
{ {
context->drawTexture(x, y, z, width, height); context->drawTexture((GLfloat)x, (GLfloat)y, (GLfloat)z, (GLfloat)width, (GLfloat)height);
} }
} }
......
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