Edit

kc3-lang/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-05-05 13:12:36
    Hash : 520c4ae2
    Message : Add a Buffer::getIndexRange function. Instead of exposing the index range cache, add a more generic method that allows the buffers to handle their own caching of index ranges. BufferImpl::getData can be hard to implement for BufferGL because there isn't a way to tell the buffer to unmap and glGetBufferSubData can be very expensive, requiring an extra copy of the data. BUG=angleproject:881 Change-Id: Idec645219056132e0d72a410fbe7b971fa02c9e9 Reviewed-on: https://chromium-review.googlesource.com/261892 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Olli Etuaho <oetuaho@nvidia.com> Tested-by: Geoff Lang <geofflang@chromium.org>

  • src/libANGLE/renderer/d3d/BufferD3D.cpp
  • //
    // Copyright 2014 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // BufferD3D.cpp Defines common functionality between the Buffer9 and Buffer11 classes.
    
    #include "libANGLE/renderer/d3d/BufferD3D.h"
    
    #include "common/utilities.h"
    #include "libANGLE/renderer/d3d/IndexBuffer.h"
    #include "libANGLE/renderer/d3d/VertexBuffer.h"
    
    namespace rx
    {
    
    unsigned int BufferD3D::mNextSerial = 1;
    
    BufferD3D::BufferD3D(BufferFactoryD3D *factory)
        : BufferImpl(),
          mFactory(factory),
          mStaticVertexBuffer(nullptr),
          mStaticIndexBuffer(nullptr),
          mUnmodifiedDataUse(0)
    {
        updateSerial();
    }
    
    BufferD3D::~BufferD3D()
    {
        SafeDelete(mStaticVertexBuffer);
        SafeDelete(mStaticIndexBuffer);
    }
    
    void BufferD3D::updateSerial()
    {
        mSerial = mNextSerial++;
    }
    
    void BufferD3D::initializeStaticData()
    {
        if (!mStaticVertexBuffer)
        {
            mStaticVertexBuffer = new StaticVertexBufferInterface(mFactory);
        }
        if (!mStaticIndexBuffer)
        {
            mStaticIndexBuffer = new StaticIndexBufferInterface(mFactory);
        }
    }
    
    void BufferD3D::invalidateStaticData()
    {
        if ((mStaticVertexBuffer && mStaticVertexBuffer->getBufferSize() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->getBufferSize() != 0))
        {
            SafeDelete(mStaticVertexBuffer);
            SafeDelete(mStaticIndexBuffer);
    
            // Re-init static data to track that we're in a static buffer
            initializeStaticData();
        }
    
        mUnmodifiedDataUse = 0;
    }
    
    // Creates static buffers if sufficient used data has been left unmodified
    void BufferD3D::promoteStaticUsage(int dataSize)
    {
        if (!mStaticVertexBuffer && !mStaticIndexBuffer)
        {
            mUnmodifiedDataUse += dataSize;
    
            if (mUnmodifiedDataUse > 3 * getSize())
            {
                initializeStaticData();
            }
        }
    }
    
    gl::Error BufferD3D::getIndexRange(GLenum type, size_t offset, size_t count, gl::RangeUI *outRange)
    {
        const uint8_t *data = nullptr;
        gl::Error error = getData(&data);
        if (error.isError())
        {
            return error;
        }
    
        *outRange = gl::ComputeIndexRange(type, data + offset, count);
        return gl::Error(GL_NO_ERROR);
    }
    
    }