Implement instancing support in D3D11.

TRAC #22414 Signed-off-by: Geoff Lang Signed-off-by: Nicolas Capens Author: Jamie Madill git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1791 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent a9b96d0d
...@@ -2021,7 +2021,7 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid ...@@ -2021,7 +2021,7 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid
if (!skipDraw(mode)) if (!skipDraw(mode))
{ {
mRenderer->drawElements(mode, count, type, indices, mState.elementArrayBuffer.get(), indexInfo); mRenderer->drawElements(mode, count, type, indices, mState.elementArrayBuffer.get(), indexInfo, instances);
} }
} }
......
...@@ -70,13 +70,15 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M ...@@ -70,13 +70,15 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M
{ {
VertexBuffer11 *vertexBuffer = VertexBuffer11::makeVertexBuffer11(attributes[i].vertexBuffer); VertexBuffer11 *vertexBuffer = VertexBuffer11::makeVertexBuffer11(attributes[i].vertexBuffer);
D3D11_INPUT_CLASSIFICATION inputClass = attributes[i].divisor > 0 ? D3D11_INPUT_PER_INSTANCE_DATA : D3D11_INPUT_PER_VERTEX_DATA;
ilKey.elements[ilKey.elementCount].SemanticName = semanticName; ilKey.elements[ilKey.elementCount].SemanticName = semanticName;
ilKey.elements[ilKey.elementCount].SemanticIndex = programBinary->getSemanticIndex(i); ilKey.elements[ilKey.elementCount].SemanticIndex = programBinary->getSemanticIndex(i);
ilKey.elements[ilKey.elementCount].Format = attributes[i].attribute->mArrayEnabled ? vertexBuffer->getDXGIFormat(*attributes[i].attribute) : DXGI_FORMAT_R32G32B32A32_FLOAT; ilKey.elements[ilKey.elementCount].Format = attributes[i].attribute->mArrayEnabled ? vertexBuffer->getDXGIFormat(*attributes[i].attribute) : DXGI_FORMAT_R32G32B32A32_FLOAT;
ilKey.elements[ilKey.elementCount].InputSlot = i; ilKey.elements[ilKey.elementCount].InputSlot = i;
ilKey.elements[ilKey.elementCount].AlignedByteOffset = 0; ilKey.elements[ilKey.elementCount].AlignedByteOffset = 0;
ilKey.elements[ilKey.elementCount].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; ilKey.elements[ilKey.elementCount].InputSlotClass = inputClass;
ilKey.elements[ilKey.elementCount].InstanceDataStepRate = 0; ilKey.elements[ilKey.elementCount].InstanceDataStepRate = attributes[i].divisor;
ilKey.elementCount++; ilKey.elementCount++;
vertexBuffers[i] = vertexBuffer->getBuffer(); vertexBuffers[i] = vertexBuffer->getBuffer();
......
...@@ -124,7 +124,7 @@ class Renderer ...@@ -124,7 +124,7 @@ class Renderer
virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) = 0; virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) = 0;
virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances) = 0; virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances) = 0;
virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo) = 0; virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances) = 0;
virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) = 0; virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) = 0;
......
...@@ -819,12 +819,11 @@ void Renderer11::drawArrays(GLenum mode, GLsizei count, GLsizei instances) ...@@ -819,12 +819,11 @@ void Renderer11::drawArrays(GLenum mode, GLsizei count, GLsizei instances)
} }
else if (mode == GL_TRIANGLE_FAN) else if (mode == GL_TRIANGLE_FAN)
{ {
drawTriangleFan(count, GL_NONE, NULL, 0, NULL); drawTriangleFan(count, GL_NONE, NULL, 0, NULL, instances);
} }
else if (instances > 0) else if (instances > 0)
{ {
// TODO mDeviceContext->DrawInstanced(count, instances, 0, 0);
UNIMPLEMENTED();
} }
else else
{ {
...@@ -832,7 +831,7 @@ void Renderer11::drawArrays(GLenum mode, GLsizei count, GLsizei instances) ...@@ -832,7 +831,7 @@ void Renderer11::drawArrays(GLenum mode, GLsizei count, GLsizei instances)
} }
} }
void Renderer11::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo) void Renderer11::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances)
{ {
if (mode == GL_LINE_LOOP) if (mode == GL_LINE_LOOP)
{ {
...@@ -840,7 +839,11 @@ void Renderer11::drawElements(GLenum mode, GLsizei count, GLenum type, const GLv ...@@ -840,7 +839,11 @@ void Renderer11::drawElements(GLenum mode, GLsizei count, GLenum type, const GLv
} }
else if (mode == GL_TRIANGLE_FAN) else if (mode == GL_TRIANGLE_FAN)
{ {
drawTriangleFan(count, type, indices, indexInfo.minIndex, elementArrayBuffer); drawTriangleFan(count, type, indices, indexInfo.minIndex, elementArrayBuffer, instances);
}
else if (instances > 0)
{
mDeviceContext->DrawIndexedInstanced(count, instances, 0, -static_cast<int>(indexInfo.minIndex), 0);
} }
else else
{ {
...@@ -940,7 +943,7 @@ void Renderer11::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, ...@@ -940,7 +943,7 @@ void Renderer11::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices,
mDeviceContext->DrawIndexed(count + 1, 0, -minIndex); mDeviceContext->DrawIndexed(count + 1, 0, -minIndex);
} }
void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer) void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer, int instances)
{ {
// Get the raw indices for an indexed draw // Get the raw indices for an indexed draw
if (type != GL_NONE && elementArrayBuffer) if (type != GL_NONE && elementArrayBuffer)
...@@ -1034,7 +1037,14 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic ...@@ -1034,7 +1037,14 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic
mAppliedIBOffset = indexBufferOffset; mAppliedIBOffset = indexBufferOffset;
} }
mDeviceContext->DrawIndexed(numTris * 3, 0, -minIndex); if (instances > 0)
{
mDeviceContext->DrawIndexedInstanced(numTris * 3, instances, 0, -minIndex, 0);
}
else
{
mDeviceContext->DrawIndexed(numTris * 3, 0, -minIndex);
}
} }
void Renderer11::applyShaders(gl::ProgramBinary *programBinary) void Renderer11::applyShaders(gl::ProgramBinary *programBinary)
...@@ -1937,9 +1947,7 @@ bool Renderer11::getOcclusionQuerySupport() const ...@@ -1937,9 +1947,7 @@ bool Renderer11::getOcclusionQuerySupport() const
bool Renderer11::getInstancingSupport() const bool Renderer11::getInstancingSupport() const
{ {
// TODO return true;
// UNIMPLEMENTED();
return false;
} }
bool Renderer11::getShareHandleSupport() const bool Renderer11::getShareHandleSupport() const
......
...@@ -78,7 +78,7 @@ class Renderer11 : public Renderer ...@@ -78,7 +78,7 @@ class Renderer11 : public Renderer
virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances); virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances);
virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo); virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances);
virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer);
...@@ -175,7 +175,7 @@ class Renderer11 : public Renderer ...@@ -175,7 +175,7 @@ class Renderer11 : public Renderer
DISALLOW_COPY_AND_ASSIGN(Renderer11); DISALLOW_COPY_AND_ASSIGN(Renderer11);
void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer); void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
void drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer); void drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer, int instances);
void readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &area, void readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &area,
GLenum format, GLenum type, GLsizei outputPitch, bool packReverseRowOrder, GLenum format, GLenum type, GLsizei outputPitch, bool packReverseRowOrder,
......
...@@ -1397,7 +1397,7 @@ void Renderer9::drawArrays(GLenum mode, GLsizei count, GLsizei instances) ...@@ -1397,7 +1397,7 @@ void Renderer9::drawArrays(GLenum mode, GLsizei count, GLsizei instances)
} }
} }
void Renderer9::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo) void Renderer9::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei /*instances*/)
{ {
startScene(); startScene();
......
...@@ -106,7 +106,7 @@ class Renderer9 : public Renderer ...@@ -106,7 +106,7 @@ class Renderer9 : public Renderer
virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); virtual GLenum applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances); virtual void drawArrays(GLenum mode, GLsizei count, GLsizei instances);
virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo); virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances);
virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer);
......
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