Commit 7b2403b1 by Alexis Hetu Committed by Alexis Hétu

Enabling Transform Feedback

This cl enables transform feedback in Context by calling Program::applyTransformFeedback(). It also adds the code required to compute vertex offsets between different draw calls, when multiple successive draw calls write into the same transform feedback buffer(s). Change-Id: Ib3bc4bdd1308486642f233f425d0088a55cb1333 Reviewed-on: https://swiftshader-review.googlesource.com/5301Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent a62a0cab
...@@ -2171,16 +2171,14 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2171,16 +2171,14 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
*params = 2; *params = 2;
break; break;
case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: // integer, at least 64 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: // integer, at least 64
UNIMPLEMENTED(); *params = sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;
*params = 64;
break; break;
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: // integer, at least 4 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: // integer, at least 4
UNIMPLEMENTED(); UNIMPLEMENTED();
*params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; *params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;
break; break;
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: // integer, at least 4 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: // integer, at least 4
UNIMPLEMENTED(); *params = sw::MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;
*params = 4;
break; break;
case GL_MAX_UNIFORM_BLOCK_SIZE: // integer, at least 16384 case GL_MAX_UNIFORM_BLOCK_SIZE: // integer, at least 16384
*params = MAX_UNIFORM_BLOCK_SIZE; *params = MAX_UNIFORM_BLOCK_SIZE;
...@@ -3012,6 +3010,7 @@ void Context::applyShaders() ...@@ -3012,6 +3010,7 @@ void Context::applyShaders()
mAppliedProgramSerial = programObject->getSerial(); mAppliedProgramSerial = programObject->getSerial();
} }
programObject->applyTransformFeedback(getTransformFeedback());
programObject->applyUniformBuffers(mState.uniformBuffers); programObject->applyUniformBuffers(mState.uniformBuffers);
programObject->applyUniforms(); programObject->applyUniforms();
} }
...@@ -3438,8 +3437,9 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -3438,8 +3437,9 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
sw::DrawType primitiveType; sw::DrawType primitiveType;
int primitiveCount; int primitiveCount;
int verticesPerPrimitive;
if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount)) if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount, verticesPerPrimitive))
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
if(primitiveCount <= 0) if(primitiveCount <= 0)
...@@ -3472,10 +3472,15 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -3472,10 +3472,15 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(!cullSkipsDraw(mode)) TransformFeedback* transformFeedback = getTransformFeedback();
if(!cullSkipsDraw(mode) || (transformFeedback->isActive() && !transformFeedback->isPaused()))
{ {
device->drawPrimitive(primitiveType, primitiveCount); device->drawPrimitive(primitiveType, primitiveCount);
} }
if(transformFeedback)
{
transformFeedback->addVertexOffset(primitiveCount * verticesPerPrimitive);
}
} }
} }
...@@ -3493,8 +3498,9 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3493,8 +3498,9 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
sw::DrawType primitiveType; sw::DrawType primitiveType;
int primitiveCount; int primitiveCount;
int verticesPerPrimitive;
if(!es2sw::ConvertPrimitiveType(mode, count, type, primitiveType, primitiveCount)) if(!es2sw::ConvertPrimitiveType(mode, count, type, primitiveType, primitiveCount, verticesPerPrimitive))
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
if(primitiveCount <= 0) if(primitiveCount <= 0)
...@@ -3535,10 +3541,15 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, ...@@ -3535,10 +3541,15 @@ void Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(!cullSkipsDraw(mode)) TransformFeedback* transformFeedback = getTransformFeedback();
if(!cullSkipsDraw(mode) || (transformFeedback->isActive() && !transformFeedback->isPaused()))
{ {
device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount); device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount);
} }
if(transformFeedback)
{
transformFeedback->addVertexOffset(primitiveCount * verticesPerPrimitive);
}
} }
} }
......
...@@ -1422,37 +1422,44 @@ namespace es2sw ...@@ -1422,37 +1422,44 @@ namespace es2sw
} }
} }
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &drawType, int &primitiveCount) bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &drawType, int &primitiveCount, int &verticesPerPrimitive)
{ {
switch(primitiveType) switch(primitiveType)
{ {
case GL_POINTS: case GL_POINTS:
drawType = sw::DRAW_POINTLIST; drawType = sw::DRAW_POINTLIST;
primitiveCount = elementCount; primitiveCount = elementCount;
verticesPerPrimitive = 1;
break; break;
case GL_LINES: case GL_LINES:
drawType = sw::DRAW_LINELIST; drawType = sw::DRAW_LINELIST;
primitiveCount = elementCount / 2; primitiveCount = elementCount / 2;
verticesPerPrimitive = 2;
break; break;
case GL_LINE_LOOP: case GL_LINE_LOOP:
drawType = sw::DRAW_LINELOOP; drawType = sw::DRAW_LINELOOP;
primitiveCount = elementCount; primitiveCount = elementCount;
verticesPerPrimitive = 2;
break; break;
case GL_LINE_STRIP: case GL_LINE_STRIP:
drawType = sw::DRAW_LINESTRIP; drawType = sw::DRAW_LINESTRIP;
primitiveCount = elementCount - 1; primitiveCount = elementCount - 1;
verticesPerPrimitive = 2;
break; break;
case GL_TRIANGLES: case GL_TRIANGLES:
drawType = sw::DRAW_TRIANGLELIST; drawType = sw::DRAW_TRIANGLELIST;
primitiveCount = elementCount / 3; primitiveCount = elementCount / 3;
verticesPerPrimitive = 3;
break; break;
case GL_TRIANGLE_STRIP: case GL_TRIANGLE_STRIP:
drawType = sw::DRAW_TRIANGLESTRIP; drawType = sw::DRAW_TRIANGLESTRIP;
primitiveCount = elementCount - 2; primitiveCount = elementCount - 2;
verticesPerPrimitive = 3;
break; break;
case GL_TRIANGLE_FAN: case GL_TRIANGLE_FAN:
drawType = sw::DRAW_TRIANGLEFAN; drawType = sw::DRAW_TRIANGLEFAN;
primitiveCount = elementCount - 2; primitiveCount = elementCount - 2;
verticesPerPrimitive = 3;
break; break;
default: default:
return false; return false;
......
...@@ -80,7 +80,7 @@ namespace es2sw ...@@ -80,7 +80,7 @@ namespace es2sw
unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha); unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha);
sw::MipmapType ConvertMipMapFilter(GLenum minFilter); sw::MipmapType ConvertMipMapFilter(GLenum minFilter);
sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy); sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy);
bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &swPrimitiveType, int &primitiveCount); bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, GLenum elementType, sw::DrawType &swPrimitiveType, int &primitiveCount, int &verticesPerPrimitive);
sw::Format ConvertRenderbufferFormat(GLenum format); sw::Format ConvertRenderbufferFormat(GLenum format);
} }
......
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