Commit 6743bbf1 by Alexis Hetu Committed by Alexis Hétu

gl_InstanceID implementation

I need some help connecting the dots here. I can see a few ways of doing it, but it isn't trivial for me to see which one would be right. Could you tell me how the value should go from the VertexProcessor to being assigned a value in the actual shader. Change-Id: Ie0bc2024f51a904ab8144c435b623cfefe8e6704 Reviewed-on: https://swiftshader-review.googlesource.com/2920Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 8f60458c
......@@ -132,6 +132,7 @@ enum TQualifier : unsigned char
// built-ins written by vertex shader
EvqPosition,
EvqPointSize,
EvqInstanceID,
// built-ins read by fragment shader
EvqFragCoord,
......@@ -199,6 +200,7 @@ inline const char *getQualifierString(TQualifier qualifier)
case EvqOutput: return "output"; break;
case EvqPosition: return "Position"; break;
case EvqPointSize: return "PointSize"; break;
case EvqInstanceID: return "InstanceID"; break;
case EvqFragCoord: return "FragCoord"; break;
case EvqFrontFacing: return "FrontFacing"; break;
case EvqFragColor: return "FragColor"; break;
......
......@@ -47,6 +47,10 @@ ShBuiltInResources::ShBuiltInResources()
MaxTextureImageUnits = 8;
MaxFragmentUniformVectors = 16;
MaxDrawBuffers = 1;
MaxVertexOutputVectors = 16;
MaxFragmentInputVectors = 15;
MinProgramTexelOffset = -8;
MaxProgramTexelOffset = 7;
// Extensions.
OES_standard_derivatives = 0;
......
......@@ -39,6 +39,10 @@ struct ShBuiltInResources
int MaxTextureImageUnits;
int MaxFragmentUniformVectors;
int MaxDrawBuffers;
int MaxVertexOutputVectors;
int MaxFragmentInputVectors;
int MinProgramTexelOffset;
int MaxProgramTexelOffset;
// Extensions.
// Set to 1 to enable the extension, else 0.
......
......@@ -319,6 +319,10 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors", resources.MaxFragmentUniformVectors);
symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors);
symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxDrawBuffers", resources.MaxDrawBuffers);
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxVertexOutputVectors", resources.MaxVertexOutputVectors);
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxFragmentInputVectors", resources.MaxFragmentInputVectors);
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MinProgramTexelOffset", resources.MinProgramTexelOffset);
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxProgramTexelOffset", resources.MaxProgramTexelOffset);
}
void IdentifyBuiltIns(GLenum shaderType,
......@@ -341,6 +345,7 @@ void IdentifyBuiltIns(GLenum shaderType,
case GL_VERTEX_SHADER:
symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpHigh, EvqPosition, 4)));
symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize, 1)));
symbolTable.insert(ESSL3_BUILTINS, *new TVariable(NewPoolTString("gl_InstanceID"), TType(EbtInt, EbpHigh, EvqInstanceID, 1)));
break;
default: assert(false && "Language not supported");
}
......
......@@ -1866,6 +1866,7 @@ namespace glsl
case EvqConstReadOnly: return sw::Shader::PARAMETER_TEMP;
case EvqPosition: return sw::Shader::PARAMETER_OUTPUT;
case EvqPointSize: return sw::Shader::PARAMETER_OUTPUT;
case EvqInstanceID: return sw::Shader::PARAMETER_MISCTYPE;
case EvqFragCoord: return sw::Shader::PARAMETER_MISCTYPE;
case EvqFrontFacing: return sw::Shader::PARAMETER_MISCTYPE;
case EvqPointCoord: return sw::Shader::PARAMETER_INPUT;
......@@ -1901,6 +1902,7 @@ namespace glsl
case EvqConstReadOnly: return temporaryRegister(operand);
case EvqPosition: return varyingRegister(operand);
case EvqPointSize: return varyingRegister(operand);
case EvqInstanceID: vertexShader->instanceIdDeclared = true; return 0;
case EvqFragCoord: pixelShader->vPosDeclared = true; return 0;
case EvqFrontFacing: pixelShader->vFaceDeclared = true; return 1;
case EvqPointCoord: return varyingRegister(operand);
......
......@@ -323,6 +323,7 @@ bool TParseContext::lValueErrorCheck(int line, const char* op, TIntermTyped* nod
case EvqFragCoord: message = "can't modify gl_FragCoord"; break;
case EvqFrontFacing: message = "can't modify gl_FrontFacing"; break;
case EvqPointCoord: message = "can't modify gl_PointCoord"; break;
case EvqInstanceID: message = "can't modify gl_InstanceID"; break;
default:
//
......
......@@ -3536,6 +3536,8 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
for(int i = 0; i < instanceCount; ++i)
{
device->setInstanceID(i);
GLenum err = applyVertexBuffer(0, first, count, i);
if(err != GL_NO_ERROR)
{
......@@ -3589,6 +3591,8 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
for(int i = 0; i < instanceCount; ++i)
{
device->setInstanceID(i);
TranslatedIndexData indexInfo;
GLenum err = applyIndexBuffer(indices, start, end, count, mode, type, &indexInfo);
if(err != GL_NO_ERROR)
......
......@@ -81,7 +81,11 @@ enum
MAX_DRAW_BUFFERS = 1,
MAX_ELEMENT_INDEX = 0x7FFFFFFF,
MAX_ELEMENTS_INDICES = 0x7FFFFFFF,
MAX_ELEMENTS_VERTICES = 0x7FFFFFFF
MAX_ELEMENTS_VERTICES = 0x7FFFFFFF,
MAX_VERTEX_OUTPUT_VECTORS = 16,
MAX_FRAGMENT_INPUT_VECTORS = 15,
MIN_PROGRAM_TEXEL_OFFSET = -8,
MAX_PROGRAM_TEXEL_OFFSET = 7,
};
const GLenum compressedTextureFormats[] =
......
......@@ -169,6 +169,10 @@ TranslatorASM *Shader::createCompiler(GLenum shaderType)
resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS;
resources.MaxDrawBuffers = MAX_DRAW_BUFFERS;
resources.MaxVertexOutputVectors = MAX_VERTEX_OUTPUT_VECTORS;
resources.MaxFragmentInputVectors = MAX_FRAGMENT_INPUT_VECTORS;
resources.MinProgramTexelOffset = MIN_PROGRAM_TEXEL_OFFSET;
resources.MaxProgramTexelOffset = MAX_PROGRAM_TEXEL_OFFSET;
resources.OES_standard_derivatives = 1;
resources.OES_fragment_precision_high = 1;
resources.OES_EGL_image_external = 1;
......
......@@ -291,6 +291,8 @@ namespace sw
pixelShader = 0;
vertexShader = 0;
instanceID = 0;
occlusionEnabled = false;
pointSpriteEnable = false;
......
......@@ -443,6 +443,9 @@ namespace sw
// Global mipmap bias
float bias;
// Instancing
int instanceID;
// Fixed-function vertex pipeline state
bool lightingEnable;
bool specularEnable;
......
......@@ -110,6 +110,8 @@ namespace sw
PS ps;
int instanceID;
VertexProcessor::PointSprite point;
float lineWidth;
......
......@@ -297,6 +297,11 @@ namespace sw
context->vertexFogMode = fogMode;
}
void VertexProcessor::setInstanceID(int instanceID)
{
context->instanceID = instanceID;
}
void VertexProcessor::setColorVertexEnable(bool colorVertexEnable)
{
context->setColorVertexEnable(colorVertexEnable);
......
......@@ -205,6 +205,8 @@ namespace sw
virtual void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic);
virtual void setLightRange(unsigned int light, float lightRange);
virtual void setInstanceID(int instanceID);
virtual void setFogEnable(bool fogEnable);
virtual void setVertexFogMode(FogMode fogMode);
virtual void setRangeFogEnable(bool enable);
......
......@@ -23,6 +23,7 @@ namespace sw
version = 0x0300;
positionRegister = Pos;
pointSizeRegister = -1; // No vertex point size
instanceIdDeclared = false;
for(int i = 0; i < MAX_INPUT_ATTRIBUTES; i++)
{
......@@ -53,6 +54,7 @@ namespace sw
positionRegister = Pos;
pointSizeRegister = -1; // No vertex point size
instanceIdDeclared = false;
for(int i = 0; i < MAX_INPUT_ATTRIBUTES; i++)
{
......
......@@ -32,6 +32,8 @@ namespace sw
int positionRegister; // FIXME: Private
int pointSizeRegister; // FIXME: Private
bool instanceIdDeclared;
enum {MAX_INPUT_ATTRIBUTES = 16};
Semantic input[MAX_INPUT_ATTRIBUTES]; // FIXME: Private
......
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