1 #include "precompiled.h"
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.
8 // Indexffer9.cpp: Defines the D3D9 IndexBuffer implementation.
10 #include "libGLESv2/renderer/d3d9/IndexBuffer9.h"
11 #include "libGLESv2/renderer/d3d9/Renderer9.h"
16 IndexBuffer9::IndexBuffer9(Renderer9 *const renderer) : mRenderer(renderer)
24 IndexBuffer9::~IndexBuffer9()
26 SafeRelease(mIndexBuffer);
29 bool IndexBuffer9::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
31 SafeRelease(mIndexBuffer);
38 if (indexType == GL_UNSIGNED_SHORT || indexType == GL_UNSIGNED_BYTE)
40 format = D3DFMT_INDEX16;
42 else if (indexType == GL_UNSIGNED_INT)
44 if (mRenderer->get32BitIndexSupport())
46 format = D3DFMT_INDEX32;
50 ERR("Attempted to create a 32-bit index buffer but renderer does not support 32-bit indices.");
56 ERR("Invalid index type %u.", indexType);
60 DWORD usageFlags = D3DUSAGE_WRITEONLY;
63 usageFlags |= D3DUSAGE_DYNAMIC;
66 HRESULT result = mRenderer->createIndexBuffer(bufferSize, usageFlags, format, &mIndexBuffer);
69 ERR("Failed to create an index buffer of size %u, result: 0x%08x.", mBufferSize, result);
74 mBufferSize = bufferSize;
75 mIndexType = indexType;
81 IndexBuffer9 *IndexBuffer9::makeIndexBuffer9(IndexBuffer *indexBuffer)
83 ASSERT(HAS_DYNAMIC_TYPE(IndexBuffer9*, indexBuffer));
84 return static_cast<IndexBuffer9*>(indexBuffer);
87 bool IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
91 DWORD lockFlags = mDynamic ? D3DLOCK_NOOVERWRITE : 0;
94 HRESULT result = mIndexBuffer->Lock(offset, size, &mapPtr, lockFlags);
97 ERR("Index buffer lock failed with error 0x%08x", result);
101 *outMappedMemory = mapPtr;
106 ERR("Index buffer not initialized.");
111 bool IndexBuffer9::unmapBuffer()
115 HRESULT result = mIndexBuffer->Unlock();
118 ERR("Index buffer unlock failed with error 0x%08x", result);
126 ERR("Index buffer not initialized.");
131 GLenum IndexBuffer9::getIndexType() const
136 unsigned int IndexBuffer9::getBufferSize() const
141 bool IndexBuffer9::setSize(unsigned int bufferSize, GLenum indexType)
143 if (bufferSize > mBufferSize || indexType != mIndexType)
145 return initialize(bufferSize, indexType, mDynamic);
153 bool IndexBuffer9::discard()
160 result = mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
163 ERR("Discard lock failed with error 0x%08x", result);
167 result = mIndexBuffer->Unlock();
170 ERR("Discard unlock failed with error 0x%08x", result);
178 ERR("Index buffer not initialized.");
183 D3DFORMAT IndexBuffer9::getIndexFormat() const
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;
194 IDirect3DIndexBuffer9 * IndexBuffer9::getBuffer() const