gfx/angle/src/libGLESv2/renderer/IndexBuffer11.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/angle/src/libGLESv2/renderer/IndexBuffer11.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,183 @@
     1.4 +#include "precompiled.h"
     1.5 +//
     1.6 +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
     1.7 +// Use of this source code is governed by a BSD-style license that can be
     1.8 +// found in the LICENSE file.
     1.9 +//
    1.10 +
    1.11 +// IndexBuffer11.cpp: Defines the D3D11 IndexBuffer implementation.
    1.12 +
    1.13 +#include "libGLESv2/renderer/IndexBuffer11.h"
    1.14 +#include "libGLESv2/renderer/Renderer11.h"
    1.15 +
    1.16 +namespace rx
    1.17 +{
    1.18 +
    1.19 +IndexBuffer11::IndexBuffer11(Renderer11 *const renderer) : mRenderer(renderer)
    1.20 +{
    1.21 +    mBuffer = NULL;
    1.22 +    mBufferSize = 0;
    1.23 +    mDynamicUsage = false;
    1.24 +}
    1.25 +
    1.26 +IndexBuffer11::~IndexBuffer11()
    1.27 +{
    1.28 +    if (mBuffer)
    1.29 +    {
    1.30 +        mBuffer->Release();
    1.31 +        mBuffer = NULL;
    1.32 +    }
    1.33 +}
    1.34 +
    1.35 +bool IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
    1.36 +{
    1.37 +    if (mBuffer)
    1.38 +    {
    1.39 +        mBuffer->Release();
    1.40 +        mBuffer = NULL;
    1.41 +    }
    1.42 +
    1.43 +    updateSerial();
    1.44 +
    1.45 +    if (bufferSize > 0)
    1.46 +    {
    1.47 +        ID3D11Device* dxDevice = mRenderer->getDevice();
    1.48 +
    1.49 +        D3D11_BUFFER_DESC bufferDesc;
    1.50 +        bufferDesc.ByteWidth = bufferSize;
    1.51 +        bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
    1.52 +        bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    1.53 +        bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    1.54 +        bufferDesc.MiscFlags = 0;
    1.55 +        bufferDesc.StructureByteStride = 0;
    1.56 +
    1.57 +        HRESULT result = dxDevice->CreateBuffer(&bufferDesc, NULL, &mBuffer);
    1.58 +        if (FAILED(result))
    1.59 +        {
    1.60 +            return false;
    1.61 +        }
    1.62 +    }
    1.63 +
    1.64 +    mBufferSize = bufferSize;
    1.65 +    mIndexType = indexType;
    1.66 +    mDynamicUsage = dynamic;
    1.67 +
    1.68 +    return true;
    1.69 +}
    1.70 +
    1.71 +IndexBuffer11 *IndexBuffer11::makeIndexBuffer11(IndexBuffer *indexBuffer)
    1.72 +{
    1.73 +    ASSERT(HAS_DYNAMIC_TYPE(IndexBuffer11*, indexBuffer));
    1.74 +    return static_cast<IndexBuffer11*>(indexBuffer);
    1.75 +}
    1.76 +
    1.77 +bool IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
    1.78 +{
    1.79 +    if (mBuffer)
    1.80 +    {
    1.81 +        // Check for integer overflows and out-out-bounds map requests
    1.82 +        if (offset + size < offset || offset + size > mBufferSize)
    1.83 +        {
    1.84 +            ERR("Index buffer map range is not inside the buffer.");
    1.85 +            return false;
    1.86 +        }
    1.87 +
    1.88 +        ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
    1.89 +
    1.90 +        D3D11_MAPPED_SUBRESOURCE mappedResource;
    1.91 +        HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
    1.92 +        if (FAILED(result))
    1.93 +        {
    1.94 +            ERR("Index buffer map failed with error 0x%08x", result);
    1.95 +            return false;
    1.96 +        }
    1.97 +
    1.98 +        *outMappedMemory = reinterpret_cast<char*>(mappedResource.pData) + offset;
    1.99 +        return true;
   1.100 +    }
   1.101 +    else
   1.102 +    {
   1.103 +        ERR("Index buffer not initialized.");
   1.104 +        return false;
   1.105 +    }
   1.106 +}
   1.107 +
   1.108 +bool IndexBuffer11::unmapBuffer()
   1.109 +{
   1.110 +    if (mBuffer)
   1.111 +    {
   1.112 +        ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
   1.113 +        dxContext->Unmap(mBuffer, 0);
   1.114 +        return true;
   1.115 +    }
   1.116 +    else
   1.117 +    {
   1.118 +        ERR("Index buffer not initialized.");
   1.119 +        return false;
   1.120 +    }
   1.121 +}
   1.122 +
   1.123 +GLenum IndexBuffer11::getIndexType() const
   1.124 +{
   1.125 +    return mIndexType;
   1.126 +}
   1.127 +
   1.128 +unsigned int IndexBuffer11::getBufferSize() const
   1.129 +{
   1.130 +    return mBufferSize;
   1.131 +}
   1.132 +
   1.133 +bool IndexBuffer11::setSize(unsigned int bufferSize, GLenum indexType)
   1.134 +{
   1.135 +    if (bufferSize > mBufferSize || indexType != mIndexType)
   1.136 +    {
   1.137 +        return initialize(bufferSize, indexType, mDynamicUsage);
   1.138 +    }
   1.139 +    else
   1.140 +    {
   1.141 +        return true;
   1.142 +    }
   1.143 +}
   1.144 +
   1.145 +bool IndexBuffer11::discard()
   1.146 +{
   1.147 +    if (mBuffer)
   1.148 +    {
   1.149 +        ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
   1.150 +
   1.151 +        D3D11_MAPPED_SUBRESOURCE mappedResource;
   1.152 +        HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
   1.153 +        if (FAILED(result))
   1.154 +        {
   1.155 +            ERR("Index buffer map failed with error 0x%08x", result);
   1.156 +            return false;
   1.157 +        }
   1.158 +
   1.159 +        dxContext->Unmap(mBuffer, 0);
   1.160 +
   1.161 +        return true;
   1.162 +    }
   1.163 +    else
   1.164 +    {
   1.165 +        ERR("Index buffer not initialized.");
   1.166 +        return false;
   1.167 +    }
   1.168 +}
   1.169 +
   1.170 +DXGI_FORMAT IndexBuffer11::getIndexFormat() const
   1.171 +{
   1.172 +    switch (mIndexType)
   1.173 +    {
   1.174 +      case GL_UNSIGNED_BYTE:    return DXGI_FORMAT_R16_UINT;
   1.175 +      case GL_UNSIGNED_SHORT:   return DXGI_FORMAT_R16_UINT;
   1.176 +      case GL_UNSIGNED_INT:     return DXGI_FORMAT_R32_UINT;
   1.177 +      default: UNREACHABLE();   return DXGI_FORMAT_UNKNOWN;
   1.178 +    }
   1.179 +}
   1.180 +
   1.181 +ID3D11Buffer *IndexBuffer11::getBuffer() const
   1.182 +{
   1.183 +    return mBuffer;
   1.184 +}
   1.185 +
   1.186 +}
   1.187 \ No newline at end of file

mercurial