From 23ba30e4b0028998ca2a53f0553e2002bf755d74 Mon Sep 17 00:00:00 2001 From: Geoff Lang Date: Mon, 8 Sep 2014 15:28:20 -0400 Subject: Move the counting IB from IndexDataManager to Renderer9. BUG=angle:520 Change-Id: Ice0a04b296af6c0a61a604f629b08603e594bb0b Reviewed-on: https://chromium-review.googlesource.com/216919 Reviewed-by: Jamie Madill Tested-by: Geoff Lang --- src/libGLESv2/renderer/d3d/IndexDataManager.cpp | 73 ----------------- src/libGLESv2/renderer/d3d/IndexDataManager.h | 2 - src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp | 103 ++++++++++++++++++++---- src/libGLESv2/renderer/d3d/d3d9/Renderer9.h | 4 + 4 files changed, 92 insertions(+), 90 deletions(-) (limited to 'src') diff --git a/src/libGLESv2/renderer/d3d/IndexDataManager.cpp b/src/libGLESv2/renderer/d3d/IndexDataManager.cpp index 10725d4f..a2c5738b 100644 --- a/src/libGLESv2/renderer/d3d/IndexDataManager.cpp +++ b/src/libGLESv2/renderer/d3d/IndexDataManager.cpp @@ -78,15 +78,12 @@ IndexDataManager::IndexDataManager(Renderer *renderer) SafeDelete(mStreamingBufferInt); ERR("Failed to allocate the streaming index buffer(s)."); } - - mCountingBuffer = NULL; } IndexDataManager::~IndexDataManager() { SafeDelete(mStreamingBufferShort); SafeDelete(mStreamingBufferInt); - SafeDelete(mCountingBuffer); } GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer *buffer, const GLvoid *indices, TranslatedIndexData *translated) @@ -237,74 +234,4 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer return GL_NO_ERROR; } -StaticIndexBufferInterface *IndexDataManager::getCountingIndices(GLsizei count) -{ - if (count <= 65536) // 16-bit indices - { - const unsigned int spaceNeeded = count * sizeof(unsigned short); - - if (!mCountingBuffer || mCountingBuffer->getBufferSize() < spaceNeeded) - { - delete mCountingBuffer; - mCountingBuffer = new StaticIndexBufferInterface(mRenderer); - mCountingBuffer->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_SHORT); - - void* mappedMemory = NULL; - if (!mCountingBuffer->mapBuffer(spaceNeeded, &mappedMemory, NULL)) - { - ERR("Failed to map counting buffer."); - return NULL; - } - - unsigned short *data = reinterpret_cast(mappedMemory); - for(int i = 0; i < count; i++) - { - data[i] = i; - } - - if (!mCountingBuffer->unmapBuffer()) - { - ERR("Failed to unmap counting buffer."); - return NULL; - } - } - } - else if (mStreamingBufferInt) // 32-bit indices supported - { - const unsigned int spaceNeeded = count * sizeof(unsigned int); - - if (!mCountingBuffer || mCountingBuffer->getBufferSize() < spaceNeeded) - { - delete mCountingBuffer; - mCountingBuffer = new StaticIndexBufferInterface(mRenderer); - mCountingBuffer->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT); - - void* mappedMemory = NULL; - if (!mCountingBuffer->mapBuffer(spaceNeeded, &mappedMemory, NULL)) - { - ERR("Failed to map counting buffer."); - return NULL; - } - - unsigned int *data = reinterpret_cast(mappedMemory); - for(int i = 0; i < count; i++) - { - data[i] = i; - } - - if (!mCountingBuffer->unmapBuffer()) - { - ERR("Failed to unmap counting buffer."); - return NULL; - } - } - } - else - { - return NULL; - } - - return mCountingBuffer; -} - } diff --git a/src/libGLESv2/renderer/d3d/IndexDataManager.h b/src/libGLESv2/renderer/d3d/IndexDataManager.h index 2a896678..93ec5ab4 100644 --- a/src/libGLESv2/renderer/d3d/IndexDataManager.h +++ b/src/libGLESv2/renderer/d3d/IndexDataManager.h @@ -52,7 +52,6 @@ class IndexDataManager virtual ~IndexDataManager(); GLenum prepareIndexData(GLenum type, GLsizei count, gl::Buffer *arrayElementBuffer, const GLvoid *indices, TranslatedIndexData *translated); - StaticIndexBufferInterface *getCountingIndices(GLsizei count); private: DISALLOW_COPY_AND_ASSIGN(IndexDataManager); @@ -61,7 +60,6 @@ class IndexDataManager StreamingIndexBufferInterface *mStreamingBufferShort; StreamingIndexBufferInterface *mStreamingBufferInt; - StaticIndexBufferInterface *mCountingBuffer; }; } diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp index 5136829e..c267fca6 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp @@ -126,6 +126,7 @@ Renderer9::Renderer9(egl::Display *display, EGLNativeDisplayType hDc, EGLint req mVertexDataManager = NULL; mIndexDataManager = NULL; mLineLoopIB = NULL; + mCountingIB = NULL; mMaxNullColorbufferLRU = 0; for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++) @@ -1306,26 +1307,23 @@ void Renderer9::drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool t } else if (instances > 0) { - StaticIndexBufferInterface *countingIB = mIndexDataManager->getCountingIndices(count); - if (countingIB) + StaticIndexBufferInterface *countingIB = getCountingIB(count); + if (!countingIB) { - if (mAppliedIBSerial != countingIB->getSerial()) - { - IndexBuffer9 *indexBuffer = IndexBuffer9::makeIndexBuffer9(countingIB->getIndexBuffer()); + return; + } - mDevice->SetIndices(indexBuffer->getBuffer()); - mAppliedIBSerial = countingIB->getSerial(); - } + if (mAppliedIBSerial != countingIB->getSerial()) + { + IndexBuffer9 *indexBuffer = IndexBuffer9::makeIndexBuffer9(countingIB->getIndexBuffer()); - for (int i = 0; i < mRepeatDraw; i++) - { - mDevice->DrawIndexedPrimitive(mPrimitiveType, 0, 0, count, 0, mPrimitiveCount); - } + mDevice->SetIndices(indexBuffer->getBuffer()); + mAppliedIBSerial = countingIB->getSerial(); } - else + + for (int i = 0; i < mRepeatDraw; i++) { - ERR("Could not create a counting index buffer for glDrawArraysInstanced."); - return gl::error(GL_OUT_OF_MEMORY); + mDevice->DrawIndexedPrimitive(mPrimitiveType, 0, 0, count, 0, mPrimitiveCount); } } else // Regular case @@ -1577,6 +1575,80 @@ void Renderer9::drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indi } } +StaticIndexBufferInterface *Renderer9::getCountingIB(size_t count) +{ + // Update the counting index buffer if it is not large enough or has not been created yet. + if (count <= 65536) // 16-bit indices + { + const unsigned int spaceNeeded = count * sizeof(unsigned short); + + if (!mCountingIB || mCountingIB->getBufferSize() < spaceNeeded) + { + SafeDelete(mCountingIB); + mCountingIB = new StaticIndexBufferInterface(this); + mCountingIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_SHORT); + + void *mappedMemory = NULL; + if (!mCountingIB->mapBuffer(spaceNeeded, &mappedMemory, NULL)) + { + ERR("Failed to map counting buffer."); + return NULL; + } + + unsigned short *data = reinterpret_cast(mappedMemory); + for (int i = 0; i < count; i++) + { + data[i] = i; + } + + if (!mCountingIB->unmapBuffer()) + { + ERR("Failed to unmap counting buffer."); + return NULL; + } + } + + return mCountingIB; + } + else if (getRendererExtensions().elementIndexUint) + { + const unsigned int spaceNeeded = count * sizeof(unsigned int); + + if (!mCountingIB || mCountingIB->getBufferSize() < spaceNeeded) + { + SafeDelete(mCountingIB); + mCountingIB = new StaticIndexBufferInterface(this); + mCountingIB->reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT); + + void *mappedMemory = NULL; + if (!mCountingIB->mapBuffer(spaceNeeded, &mappedMemory, NULL)) + { + ERR("Failed to map counting buffer."); + return NULL; + } + + unsigned int *data = reinterpret_cast(mappedMemory); + for (int i = 0; i < count; i++) + { + data[i] = i; + } + + if (!mCountingIB->unmapBuffer()) + { + ERR("Failed to unmap counting buffer."); + return NULL; + } + } + + return mCountingIB; + } + else + { + ERR("Could not create a counting index buffer for glDrawArraysInstanced."); + return gl::error(GL_OUT_OF_MEMORY, NULL); + } +} + void Renderer9::applyShaders(gl::ProgramBinary *programBinary, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer, bool rasterizerDiscard, bool transformFeedbackActive) { @@ -1982,6 +2054,7 @@ void Renderer9::releaseDeviceResources() SafeDelete(mVertexDataManager); SafeDelete(mIndexDataManager); SafeDelete(mLineLoopIB); + SafeDelete(mCountingIB); for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++) { diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h index 84e64dc1..d6a41b61 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h @@ -27,6 +27,7 @@ namespace rx class VertexDataManager; class IndexDataManager; class StreamingIndexBufferInterface; +class StaticIndexBufferInterface; struct TranslatedAttribute; class Blit9; @@ -211,6 +212,8 @@ class Renderer9 : public Renderer void drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer); void drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer); + StaticIndexBufferInterface *getCountingIB(size_t count); + bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged); gl::FramebufferAttachment *getNullColorbuffer(gl::FramebufferAttachment *depthbuffer); @@ -321,6 +324,7 @@ class Renderer9 : public Renderer IndexDataManager *mIndexDataManager; StreamingIndexBufferInterface *mLineLoopIB; + StaticIndexBufferInterface *mCountingIB; enum { NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12 }; struct NullColorbufferCacheEntry -- cgit v1.2.3