blob: bc2e6a8002c712998a39a09cdbc0a07019733051 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.coma5e0d722012-12-20 21:09:36 +00002//
3// Copyright (c) 2002-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// Indexffer9.cpp: Defines the D3D9 IndexBuffer implementation.
9
Geoff Langd47e0fc2013-08-29 11:40:43 -040010#include "libGLESv2/renderer/d3d9/IndexBuffer9.h"
11#include "libGLESv2/renderer/d3d9/Renderer9.h"
daniel@transgaming.coma5e0d722012-12-20 21:09:36 +000012
13namespace rx
14{
15
16IndexBuffer9::IndexBuffer9(Renderer9 *const renderer) : mRenderer(renderer)
17{
18 mIndexBuffer = NULL;
19 mBufferSize = 0;
20 mIndexType = 0;
21 mDynamic = false;
22}
23
24IndexBuffer9::~IndexBuffer9()
25{
Geoff Langea228632013-07-30 15:17:12 -040026 SafeRelease(mIndexBuffer);
daniel@transgaming.coma5e0d722012-12-20 21:09:36 +000027}
28
29bool IndexBuffer9::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
30{
Geoff Langea228632013-07-30 15:17:12 -040031 SafeRelease(mIndexBuffer);
daniel@transgaming.coma5e0d722012-12-20 21:09:36 +000032
33 updateSerial();
34
35 if (bufferSize > 0)
36 {
37 D3DFORMAT format;
38 if (indexType == GL_UNSIGNED_SHORT || indexType == GL_UNSIGNED_BYTE)
39 {
40 format = D3DFMT_INDEX16;
41 }
42 else if (indexType == GL_UNSIGNED_INT)
43 {
44 if (mRenderer->get32BitIndexSupport())
45 {
46 format = D3DFMT_INDEX32;
47 }
48 else
49 {
50 ERR("Attempted to create a 32-bit index buffer but renderer does not support 32-bit indices.");
51 return false;
52 }
53 }
54 else
55 {
56 ERR("Invalid index type %u.", indexType);
57 return false;
58 }
59
60 DWORD usageFlags = D3DUSAGE_WRITEONLY;
61 if (dynamic)
62 {
63 usageFlags |= D3DUSAGE_DYNAMIC;
64 }
65
66 HRESULT result = mRenderer->createIndexBuffer(bufferSize, usageFlags, format, &mIndexBuffer);
67 if (FAILED(result))
68 {
69 ERR("Failed to create an index buffer of size %u, result: 0x%08x.", mBufferSize, result);
70 return false;
71 }
72 }
73
74 mBufferSize = bufferSize;
75 mIndexType = indexType;
76 mDynamic = dynamic;
77
78 return true;
79}
80
81IndexBuffer9 *IndexBuffer9::makeIndexBuffer9(IndexBuffer *indexBuffer)
82{
apatrick@chromium.org8b400b12013-01-30 21:53:40 +000083 ASSERT(HAS_DYNAMIC_TYPE(IndexBuffer9*, indexBuffer));
daniel@transgaming.coma5e0d722012-12-20 21:09:36 +000084 return static_cast<IndexBuffer9*>(indexBuffer);
85}
86
87bool IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
88{
89 if (mIndexBuffer)
90 {
91 DWORD lockFlags = mDynamic ? D3DLOCK_NOOVERWRITE : 0;
92
93 void *mapPtr = NULL;
94 HRESULT result = mIndexBuffer->Lock(offset, size, &mapPtr, lockFlags);
95 if (FAILED(result))
96 {
97 ERR("Index buffer lock failed with error 0x%08x", result);
98 return false;
99 }
100
101 *outMappedMemory = mapPtr;
102 return true;
103 }
104 else
105 {
106 ERR("Index buffer not initialized.");
107 return false;
108 }
109}
110
111bool IndexBuffer9::unmapBuffer()
112{
113 if (mIndexBuffer)
114 {
115 HRESULT result = mIndexBuffer->Unlock();
116 if (FAILED(result))
117 {
118 ERR("Index buffer unlock failed with error 0x%08x", result);
119 return false;
120 }
121
122 return true;
123 }
124 else
125 {
126 ERR("Index buffer not initialized.");
127 return false;
128 }
129}
130
131GLenum IndexBuffer9::getIndexType() const
132{
133 return mIndexType;
134}
135
136unsigned int IndexBuffer9::getBufferSize() const
137{
138 return mBufferSize;
139}
140
141bool IndexBuffer9::setSize(unsigned int bufferSize, GLenum indexType)
142{
143 if (bufferSize > mBufferSize || indexType != mIndexType)
144 {
145 return initialize(bufferSize, indexType, mDynamic);
146 }
147 else
148 {
149 return true;
150 }
151}
152
153bool IndexBuffer9::discard()
154{
155 if (mIndexBuffer)
156 {
157 void *dummy;
158 HRESULT result;
159
160 result = mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
161 if (FAILED(result))
162 {
163 ERR("Discard lock failed with error 0x%08x", result);
164 return false;
165 }
166
167 result = mIndexBuffer->Unlock();
168 if (FAILED(result))
169 {
170 ERR("Discard unlock failed with error 0x%08x", result);
171 return false;
172 }
173
174 return true;
175 }
176 else
177 {
178 ERR("Index buffer not initialized.");
179 return false;
180 }
181}
182
183D3DFORMAT IndexBuffer9::getIndexFormat() const
184{
185 switch (mIndexType)
186 {
187 case GL_UNSIGNED_BYTE: return D3DFMT_INDEX16;
188 case GL_UNSIGNED_SHORT: return D3DFMT_INDEX16;
189 case GL_UNSIGNED_INT: return D3DFMT_INDEX32;
190 default: UNREACHABLE(); return D3DFMT_UNKNOWN;
191 }
192}
193
194IDirect3DIndexBuffer9 * IndexBuffer9::getBuffer() const
195{
196 return mIndexBuffer;
197}
198
199}