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 ...@@ -132,6 +132,7 @@ enum TQualifier : unsigned char
// built-ins written by vertex shader // built-ins written by vertex shader
EvqPosition, EvqPosition,
EvqPointSize, EvqPointSize,
EvqInstanceID,
// built-ins read by fragment shader // built-ins read by fragment shader
EvqFragCoord, EvqFragCoord,
...@@ -199,6 +200,7 @@ inline const char *getQualifierString(TQualifier qualifier) ...@@ -199,6 +200,7 @@ inline const char *getQualifierString(TQualifier qualifier)
case EvqOutput: return "output"; break; case EvqOutput: return "output"; break;
case EvqPosition: return "Position"; break; case EvqPosition: return "Position"; break;
case EvqPointSize: return "PointSize"; break; case EvqPointSize: return "PointSize"; break;
case EvqInstanceID: return "InstanceID"; break;
case EvqFragCoord: return "FragCoord"; break; case EvqFragCoord: return "FragCoord"; break;
case EvqFrontFacing: return "FrontFacing"; break; case EvqFrontFacing: return "FrontFacing"; break;
case EvqFragColor: return "FragColor"; break; case EvqFragColor: return "FragColor"; break;
......
...@@ -47,6 +47,10 @@ ShBuiltInResources::ShBuiltInResources() ...@@ -47,6 +47,10 @@ ShBuiltInResources::ShBuiltInResources()
MaxTextureImageUnits = 8; MaxTextureImageUnits = 8;
MaxFragmentUniformVectors = 16; MaxFragmentUniformVectors = 16;
MaxDrawBuffers = 1; MaxDrawBuffers = 1;
MaxVertexOutputVectors = 16;
MaxFragmentInputVectors = 15;
MinProgramTexelOffset = -8;
MaxProgramTexelOffset = 7;
// Extensions. // Extensions.
OES_standard_derivatives = 0; OES_standard_derivatives = 0;
......
...@@ -39,6 +39,10 @@ struct ShBuiltInResources ...@@ -39,6 +39,10 @@ struct ShBuiltInResources
int MaxTextureImageUnits; int MaxTextureImageUnits;
int MaxFragmentUniformVectors; int MaxFragmentUniformVectors;
int MaxDrawBuffers; int MaxDrawBuffers;
int MaxVertexOutputVectors;
int MaxFragmentInputVectors;
int MinProgramTexelOffset;
int MaxProgramTexelOffset;
// Extensions. // Extensions.
// Set to 1 to enable the extension, else 0. // Set to 1 to enable the extension, else 0.
......
...@@ -319,6 +319,10 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS ...@@ -319,6 +319,10 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors", resources.MaxFragmentUniformVectors); symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors", resources.MaxFragmentUniformVectors);
symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors); symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors);
symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxDrawBuffers", resources.MaxDrawBuffers); 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, void IdentifyBuiltIns(GLenum shaderType,
...@@ -341,6 +345,7 @@ void IdentifyBuiltIns(GLenum shaderType, ...@@ -341,6 +345,7 @@ void IdentifyBuiltIns(GLenum shaderType,
case GL_VERTEX_SHADER: 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_Position"), TType(EbtFloat, EbpHigh, EvqPosition, 4)));
symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize, 1))); 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; break;
default: assert(false && "Language not supported"); default: assert(false && "Language not supported");
} }
......
...@@ -1866,6 +1866,7 @@ namespace glsl ...@@ -1866,6 +1866,7 @@ namespace glsl
case EvqConstReadOnly: return sw::Shader::PARAMETER_TEMP; case EvqConstReadOnly: return sw::Shader::PARAMETER_TEMP;
case EvqPosition: return sw::Shader::PARAMETER_OUTPUT; case EvqPosition: return sw::Shader::PARAMETER_OUTPUT;
case EvqPointSize: 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 EvqFragCoord: return sw::Shader::PARAMETER_MISCTYPE;
case EvqFrontFacing: return sw::Shader::PARAMETER_MISCTYPE; case EvqFrontFacing: return sw::Shader::PARAMETER_MISCTYPE;
case EvqPointCoord: return sw::Shader::PARAMETER_INPUT; case EvqPointCoord: return sw::Shader::PARAMETER_INPUT;
...@@ -1901,6 +1902,7 @@ namespace glsl ...@@ -1901,6 +1902,7 @@ namespace glsl
case EvqConstReadOnly: return temporaryRegister(operand); case EvqConstReadOnly: return temporaryRegister(operand);
case EvqPosition: return varyingRegister(operand); case EvqPosition: return varyingRegister(operand);
case EvqPointSize: return varyingRegister(operand); case EvqPointSize: return varyingRegister(operand);
case EvqInstanceID: vertexShader->instanceIdDeclared = true; return 0;
case EvqFragCoord: pixelShader->vPosDeclared = true; return 0; case EvqFragCoord: pixelShader->vPosDeclared = true; return 0;
case EvqFrontFacing: pixelShader->vFaceDeclared = true; return 1; case EvqFrontFacing: pixelShader->vFaceDeclared = true; return 1;
case EvqPointCoord: return varyingRegister(operand); case EvqPointCoord: return varyingRegister(operand);
......
...@@ -323,6 +323,7 @@ bool TParseContext::lValueErrorCheck(int line, const char* op, TIntermTyped* nod ...@@ -323,6 +323,7 @@ bool TParseContext::lValueErrorCheck(int line, const char* op, TIntermTyped* nod
case EvqFragCoord: message = "can't modify gl_FragCoord"; break; case EvqFragCoord: message = "can't modify gl_FragCoord"; break;
case EvqFrontFacing: message = "can't modify gl_FrontFacing"; break; case EvqFrontFacing: message = "can't modify gl_FrontFacing"; break;
case EvqPointCoord: message = "can't modify gl_PointCoord"; break; case EvqPointCoord: message = "can't modify gl_PointCoord"; break;
case EvqInstanceID: message = "can't modify gl_InstanceID"; break;
default: default:
// //
......
...@@ -3536,6 +3536,8 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -3536,6 +3536,8 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
for(int i = 0; i < instanceCount; ++i) for(int i = 0; i < instanceCount; ++i)
{ {
device->setInstanceID(i);
GLenum err = applyVertexBuffer(0, first, count, i); GLenum err = applyVertexBuffer(0, first, count, i);
if(err != GL_NO_ERROR) if(err != GL_NO_ERROR)
{ {
...@@ -3589,6 +3591,8 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3589,6 +3591,8 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
for(int i = 0; i < instanceCount; ++i) for(int i = 0; i < instanceCount; ++i)
{ {
device->setInstanceID(i);
TranslatedIndexData indexInfo; TranslatedIndexData indexInfo;
GLenum err = applyIndexBuffer(indices, start, end, count, mode, type, &indexInfo); GLenum err = applyIndexBuffer(indices, start, end, count, mode, type, &indexInfo);
if(err != GL_NO_ERROR) if(err != GL_NO_ERROR)
......
...@@ -81,7 +81,11 @@ enum ...@@ -81,7 +81,11 @@ enum
MAX_DRAW_BUFFERS = 1, MAX_DRAW_BUFFERS = 1,
MAX_ELEMENT_INDEX = 0x7FFFFFFF, MAX_ELEMENT_INDEX = 0x7FFFFFFF,
MAX_ELEMENTS_INDICES = 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[] = const GLenum compressedTextureFormats[] =
......
...@@ -169,6 +169,10 @@ TranslatorASM *Shader::createCompiler(GLenum shaderType) ...@@ -169,6 +169,10 @@ TranslatorASM *Shader::createCompiler(GLenum shaderType)
resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS;
resources.MaxDrawBuffers = MAX_DRAW_BUFFERS; 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_standard_derivatives = 1;
resources.OES_fragment_precision_high = 1; resources.OES_fragment_precision_high = 1;
resources.OES_EGL_image_external = 1; resources.OES_EGL_image_external = 1;
......
...@@ -291,6 +291,8 @@ namespace sw ...@@ -291,6 +291,8 @@ namespace sw
pixelShader = 0; pixelShader = 0;
vertexShader = 0; vertexShader = 0;
instanceID = 0;
occlusionEnabled = false; occlusionEnabled = false;
pointSpriteEnable = false; pointSpriteEnable = false;
......
...@@ -443,6 +443,9 @@ namespace sw ...@@ -443,6 +443,9 @@ namespace sw
// Global mipmap bias // Global mipmap bias
float bias; float bias;
// Instancing
int instanceID;
// Fixed-function vertex pipeline state // Fixed-function vertex pipeline state
bool lightingEnable; bool lightingEnable;
bool specularEnable; bool specularEnable;
......
...@@ -110,6 +110,8 @@ namespace sw ...@@ -110,6 +110,8 @@ namespace sw
PS ps; PS ps;
int instanceID;
VertexProcessor::PointSprite point; VertexProcessor::PointSprite point;
float lineWidth; float lineWidth;
......
...@@ -297,6 +297,11 @@ namespace sw ...@@ -297,6 +297,11 @@ namespace sw
context->vertexFogMode = fogMode; context->vertexFogMode = fogMode;
} }
void VertexProcessor::setInstanceID(int instanceID)
{
context->instanceID = instanceID;
}
void VertexProcessor::setColorVertexEnable(bool colorVertexEnable) void VertexProcessor::setColorVertexEnable(bool colorVertexEnable)
{ {
context->setColorVertexEnable(colorVertexEnable); context->setColorVertexEnable(colorVertexEnable);
......
...@@ -205,6 +205,8 @@ namespace sw ...@@ -205,6 +205,8 @@ namespace sw
virtual void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic); virtual void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic);
virtual void setLightRange(unsigned int light, float lightRange); virtual void setLightRange(unsigned int light, float lightRange);
virtual void setInstanceID(int instanceID);
virtual void setFogEnable(bool fogEnable); virtual void setFogEnable(bool fogEnable);
virtual void setVertexFogMode(FogMode fogMode); virtual void setVertexFogMode(FogMode fogMode);
virtual void setRangeFogEnable(bool enable); virtual void setRangeFogEnable(bool enable);
......
...@@ -23,6 +23,7 @@ namespace sw ...@@ -23,6 +23,7 @@ namespace sw
version = 0x0300; version = 0x0300;
positionRegister = Pos; positionRegister = Pos;
pointSizeRegister = -1; // No vertex point size pointSizeRegister = -1; // No vertex point size
instanceIdDeclared = false;
for(int i = 0; i < MAX_INPUT_ATTRIBUTES; i++) for(int i = 0; i < MAX_INPUT_ATTRIBUTES; i++)
{ {
...@@ -53,6 +54,7 @@ namespace sw ...@@ -53,6 +54,7 @@ namespace sw
positionRegister = Pos; positionRegister = Pos;
pointSizeRegister = -1; // No vertex point size pointSizeRegister = -1; // No vertex point size
instanceIdDeclared = false;
for(int i = 0; i < MAX_INPUT_ATTRIBUTES; i++) for(int i = 0; i < MAX_INPUT_ATTRIBUTES; i++)
{ {
......
...@@ -32,6 +32,8 @@ namespace sw ...@@ -32,6 +32,8 @@ namespace sw
int positionRegister; // FIXME: Private int positionRegister; // FIXME: Private
int pointSizeRegister; // FIXME: Private int pointSizeRegister; // FIXME: Private
bool instanceIdDeclared;
enum {MAX_INPUT_ATTRIBUTES = 16}; enum {MAX_INPUT_ATTRIBUTES = 16};
Semantic input[MAX_INPUT_ATTRIBUTES]; // FIXME: Private 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