2 // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
7 // IndexBuffer11.cpp: Defines the D3D11 IndexBuffer implementation.
9 #include "libGLESv2/renderer/d3d/d3d11/IndexBuffer11.h"
10 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
15 IndexBuffer11::IndexBuffer11(Renderer11 *const renderer) : mRenderer(renderer)
19 mDynamicUsage = false;
22 IndexBuffer11::~IndexBuffer11()
27 gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
35 ID3D11Device* dxDevice = mRenderer->getDevice();
37 D3D11_BUFFER_DESC bufferDesc;
38 bufferDesc.ByteWidth = bufferSize;
39 bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
40 bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
41 bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
42 bufferDesc.MiscFlags = 0;
43 bufferDesc.StructureByteStride = 0;
45 HRESULT result = dxDevice->CreateBuffer(&bufferDesc, NULL, &mBuffer);
48 return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal index buffer of size, %lu.", bufferSize);
52 mBufferSize = bufferSize;
53 mIndexType = indexType;
54 mDynamicUsage = dynamic;
56 return gl::Error(GL_NO_ERROR);
59 IndexBuffer11 *IndexBuffer11::makeIndexBuffer11(IndexBuffer *indexBuffer)
61 ASSERT(HAS_DYNAMIC_TYPE(IndexBuffer11*, indexBuffer));
62 return static_cast<IndexBuffer11*>(indexBuffer);
65 gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
69 return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
72 // Check for integer overflows and out-out-bounds map requests
73 if (offset + size < offset || offset + size > mBufferSize)
75 return gl::Error(GL_OUT_OF_MEMORY, "Index buffer map range is not inside the buffer.");
78 ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
80 D3D11_MAPPED_SUBRESOURCE mappedResource;
81 HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
84 return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal index buffer, HRESULT: 0x%08x.", result);
87 *outMappedMemory = reinterpret_cast<char*>(mappedResource.pData) + offset;
88 return gl::Error(GL_NO_ERROR);
91 gl::Error IndexBuffer11::unmapBuffer()
95 return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
98 ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
99 dxContext->Unmap(mBuffer, 0);
100 return gl::Error(GL_NO_ERROR);
103 GLenum IndexBuffer11::getIndexType() const
108 unsigned int IndexBuffer11::getBufferSize() const
113 gl::Error IndexBuffer11::setSize(unsigned int bufferSize, GLenum indexType)
115 if (bufferSize > mBufferSize || indexType != mIndexType)
117 return initialize(bufferSize, indexType, mDynamicUsage);
121 return gl::Error(GL_NO_ERROR);
125 gl::Error IndexBuffer11::discard()
129 return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
132 ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
134 D3D11_MAPPED_SUBRESOURCE mappedResource;
135 HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
138 return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal index buffer, HRESULT: 0x%08x.", result);
141 dxContext->Unmap(mBuffer, 0);
143 return gl::Error(GL_NO_ERROR);
146 DXGI_FORMAT IndexBuffer11::getIndexFormat() const
150 case GL_UNSIGNED_BYTE: return DXGI_FORMAT_R16_UINT;
151 case GL_UNSIGNED_SHORT: return DXGI_FORMAT_R16_UINT;
152 case GL_UNSIGNED_INT: return DXGI_FORMAT_R32_UINT;
153 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN;
157 ID3D11Buffer *IndexBuffer11::getBuffer() const