2 // Copyright (c) 2002-2014 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 // Indexffer9.cpp: Defines the D3D9 IndexBuffer implementation.
9 #include "libGLESv2/renderer/d3d/d3d9/IndexBuffer9.h"
10 #include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
15 IndexBuffer9::IndexBuffer9(Renderer9 *const renderer) : mRenderer(renderer)
23 IndexBuffer9::~IndexBuffer9()
25 SafeRelease(mIndexBuffer);
28 gl::Error IndexBuffer9::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
30 SafeRelease(mIndexBuffer);
36 D3DFORMAT format = D3DFMT_UNKNOWN;
37 if (indexType == GL_UNSIGNED_SHORT || indexType == GL_UNSIGNED_BYTE)
39 format = D3DFMT_INDEX16;
41 else if (indexType == GL_UNSIGNED_INT)
43 ASSERT(mRenderer->getRendererExtensions().elementIndexUint);
44 format = D3DFMT_INDEX32;
48 DWORD usageFlags = D3DUSAGE_WRITEONLY;
51 usageFlags |= D3DUSAGE_DYNAMIC;
54 HRESULT result = mRenderer->createIndexBuffer(bufferSize, usageFlags, format, &mIndexBuffer);
57 return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal index buffer of size, %lu.", bufferSize);
61 mBufferSize = bufferSize;
62 mIndexType = indexType;
65 return gl::Error(GL_NO_ERROR);
68 IndexBuffer9 *IndexBuffer9::makeIndexBuffer9(IndexBuffer *indexBuffer)
70 ASSERT(HAS_DYNAMIC_TYPE(IndexBuffer9*, indexBuffer));
71 return static_cast<IndexBuffer9*>(indexBuffer);
74 gl::Error IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
78 return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
81 DWORD lockFlags = mDynamic ? D3DLOCK_NOOVERWRITE : 0;
84 HRESULT result = mIndexBuffer->Lock(offset, size, &mapPtr, lockFlags);
87 return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal index buffer, HRESULT: 0x%08x.", result);
90 *outMappedMemory = mapPtr;
91 return gl::Error(GL_NO_ERROR);
94 gl::Error IndexBuffer9::unmapBuffer()
98 return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
101 HRESULT result = mIndexBuffer->Unlock();
104 return gl::Error(GL_OUT_OF_MEMORY, "Failed to unlock internal index buffer, HRESULT: 0x%08x.", result);
107 return gl::Error(GL_NO_ERROR);
110 GLenum IndexBuffer9::getIndexType() const
115 unsigned int IndexBuffer9::getBufferSize() const
120 gl::Error IndexBuffer9::setSize(unsigned int bufferSize, GLenum indexType)
122 if (bufferSize > mBufferSize || indexType != mIndexType)
124 return initialize(bufferSize, indexType, mDynamic);
128 return gl::Error(GL_NO_ERROR);
132 gl::Error IndexBuffer9::discard()
136 return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
142 result = mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
145 return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal index buffer, HRESULT: 0x%08x.", result);
148 result = mIndexBuffer->Unlock();
151 return gl::Error(GL_OUT_OF_MEMORY, "Failed to unlock internal index buffer, HRESULT: 0x%08x.", result);
154 return gl::Error(GL_NO_ERROR);
157 D3DFORMAT IndexBuffer9::getIndexFormat() const
161 case GL_UNSIGNED_BYTE: return D3DFMT_INDEX16;
162 case GL_UNSIGNED_SHORT: return D3DFMT_INDEX16;
163 case GL_UNSIGNED_INT: return D3DFMT_INDEX32;
164 default: UNREACHABLE(); return D3DFMT_UNKNOWN;
168 IDirect3DIndexBuffer9 * IndexBuffer9::getBuffer() const