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)
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].combineRGB = GL_MODULATE;
mState.textureUnit[i].combineAlpha = GL_MODULATE;
......@@ -1938,6 +1939,8 @@ void Context::applyTextures()
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)
{
device->setFirstArgument(unit, sw::TextureStage::SOURCE_TEXTURE); // Cs
......@@ -2110,6 +2113,11 @@ void Context::setTextureEnvMode(GLenum 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)
{
mState.textureUnit[mState.activeSampler].combineRGB = combineRGB;
......@@ -2120,6 +2128,66 @@ void Context::setCombineAlpha(GLenum 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)
{
sw::Resource *resource = 0;
......
......@@ -182,6 +182,7 @@ typedef VertexAttribute VertexAttributeArray[MAX_VERTEX_ATTRIBS];
struct TextureUnit
{
Color color;
GLenum environmentMode;
GLenum combineRGB;
GLenum combineAlpha;
......@@ -362,8 +363,21 @@ public:
unsigned int getActiveTexture() const;
void setTextureEnvMode(GLenum texEnvMode);
void setTextureEnvColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
void setCombineRGB(GLenum combineRGB);
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);
......
......@@ -3193,11 +3193,265 @@ void TexEnvf(GLenum target, GLenum pname, GLfloat param)
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)
{
TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
es1::Context *context = es1::getContext();
if(context)
......@@ -3227,7 +3481,7 @@ void TexEnvi(GLenum target, GLenum pname, GLint param)
context->setTextureEnvMode((GLenum)param);
break;
case GL_TEXTURE_ENV_COLOR:
UNIMPLEMENTED();
return error(GL_INVALID_ENUM); // Needs four values, should call glTexEnviv() instead
break;
case GL_COMBINE_RGB:
switch((GLenum)param)
......@@ -3264,28 +3518,180 @@ void TexEnvi(GLenum target, GLenum pname, GLint param)
context->setCombineAlpha((GLenum)param);
break;
case GL_RGB_SCALE:
UNIMPLEMENTED();
if(param != 1 && param != 2 && param != 4)
{
return error(GL_INVALID_VALUE);
}
if(param != 1) UNIMPLEMENTED();
break;
case GL_ALPHA_SCALE:
UNIMPLEMENTED();
if(param != 1 && param != 2 && param != 4)
{
return error(GL_INVALID_VALUE);
}
if(param != 1) UNIMPLEMENTED();
break;
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;
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;
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;
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;
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;
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;
default:
return error(GL_INVALID_ENUM);
......@@ -3779,7 +4185,7 @@ void DrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height)
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