blob: 5936b13507e68626eda64d1947dd295734315901 [file] [log] [blame]
daniel@transgaming.com11c2af52012-12-20 21:10:01 +00001//
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.
5//
6
7// IndexBuffer11.cpp: Defines the D3D11 IndexBuffer implementation.
8
9#include "libGLESv2/renderer/IndexBuffer11.h"
10
11namespace rx
12{
13
14IndexBuffer11::IndexBuffer11(Renderer11 *const renderer) : mRenderer(renderer)
15{
16 mBuffer = NULL;
17 mBufferSize = 0;
18 mDynamicUsage = false;
19}
20
21IndexBuffer11::~IndexBuffer11()
22{
23 if (mBuffer)
24 {
25 mBuffer->Release();
26 mBuffer = NULL;
27 }
28}
29
30bool IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
31{
32 if (mBuffer)
33 {
34 mBuffer->Release();
35 mBuffer = NULL;
36 }
37
38 updateSerial();
39
40 if (bufferSize > 0)
41 {
42 ID3D11Device* dxDevice = mRenderer->getDevice();
43
44 D3D11_BUFFER_DESC bufferDesc;
45 bufferDesc.ByteWidth = bufferSize;
46 bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
47 bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
48 bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
49 bufferDesc.MiscFlags = 0;
50 bufferDesc.StructureByteStride = 0;
51
52 HRESULT result = dxDevice->CreateBuffer(&bufferDesc, NULL, &mBuffer);
53 if (FAILED(result))
54 {
55 return false;
56 }
57 }
58
59 mBufferSize = bufferSize;
60 mIndexType = indexType;
61 mDynamicUsage = dynamic;
62
63 return true;
64}
65
66IndexBuffer11 *IndexBuffer11::makeIndexBuffer11(IndexBuffer *indexBuffer)
67{
apatrick@chromium.org8b400b12013-01-30 21:53:40 +000068 ASSERT(HAS_DYNAMIC_TYPE(IndexBuffer11*, indexBuffer));
daniel@transgaming.com11c2af52012-12-20 21:10:01 +000069 return static_cast<IndexBuffer11*>(indexBuffer);
70}
71
72bool IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
73{
74 if (mBuffer)
75 {
76 if (offset + size > mBufferSize)
77 {
78 ERR("Index buffer map range is not inside the buffer.");
79 return false;
80 }
81
82 ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
83
84 D3D11_MAPPED_SUBRESOURCE mappedResource;
85 HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
86 if (FAILED(result))
87 {
88 ERR("Index buffer map failed with error 0x%08x", result);
89 return false;
90 }
91
92 *outMappedMemory = reinterpret_cast<char*>(mappedResource.pData) + offset;
93 return true;
94 }
95 else
96 {
97 ERR("Index buffer not initialized.");
98 return false;
99 }
100}
101
102bool IndexBuffer11::unmapBuffer()
103{
104 if (mBuffer)
105 {
106 ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
107 dxContext->Unmap(mBuffer, 0);
108 return true;
109 }
110 else
111 {
112 ERR("Index buffer not initialized.");
113 return false;
114 }
115}
116
117GLenum IndexBuffer11::getIndexType() const
118{
119 return mIndexType;
120}
121
122unsigned int IndexBuffer11::getBufferSize() const
123{
124 return mBufferSize;
125}
126
127bool IndexBuffer11::setSize(unsigned int bufferSize, GLenum indexType)
128{
129 if (bufferSize > mBufferSize || indexType != mIndexType)
130 {
131 return initialize(bufferSize, indexType, mDynamicUsage);
132 }
133 else
134 {
135 return true;
136 }
137}
138
139bool IndexBuffer11::discard()
140{
141 if (mBuffer)
142 {
143 ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
144
145 D3D11_MAPPED_SUBRESOURCE mappedResource;
146 HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
147 if (FAILED(result))
148 {
149 ERR("Index buffer map failed with error 0x%08x", result);
150 return false;
151 }
152
153 dxContext->Unmap(mBuffer, 0);
154
155 return true;
156 }
157 else
158 {
159 ERR("Index buffer not initialized.");
160 return false;
161 }
162}
163
164DXGI_FORMAT IndexBuffer11::getIndexFormat() const
165{
166 switch (mIndexType)
167 {
168 case GL_UNSIGNED_BYTE: return DXGI_FORMAT_R16_UINT;
169 case GL_UNSIGNED_SHORT: return DXGI_FORMAT_R16_UINT;
170 case GL_UNSIGNED_INT: return DXGI_FORMAT_R32_UINT;
171 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN;
172 }
173}
174
175ID3D11Buffer *IndexBuffer11::getBuffer() const
176{
177 return mBuffer;
178}
179
180}