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