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