Implemented IndexBuffer9.

TRAC #22237 Author: Geoff Lang Signed-off-by: Shannon Woods Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1605 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 2befccdf
...@@ -260,6 +260,8 @@ ...@@ -260,6 +260,8 @@
'libGLESv2/renderer/ImageSSE2.cpp', 'libGLESv2/renderer/ImageSSE2.cpp',
'libGLESv2/renderer/IndexBuffer.cpp', 'libGLESv2/renderer/IndexBuffer.cpp',
'libGLESv2/renderer/IndexBuffer.h', 'libGLESv2/renderer/IndexBuffer.h',
'libGLESv2/renderer/IndexBuffer9.cpp',
'libGLESv2/renderer/IndexBuffer9.h',
'libGLESv2/renderer/IndexDataManager.cpp', 'libGLESv2/renderer/IndexDataManager.cpp',
'libGLESv2/renderer/IndexDataManager.h', 'libGLESv2/renderer/IndexDataManager.h',
'libGLESv2/renderer/Renderer.cpp', 'libGLESv2/renderer/Renderer.cpp',
......
...@@ -248,6 +248,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\" ...@@ -248,6 +248,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClCompile Include="renderer\Image.cpp" /> <ClCompile Include="renderer\Image.cpp" />
<ClCompile Include="renderer\Image9.cpp" /> <ClCompile Include="renderer\Image9.cpp" />
<ClCompile Include="renderer\IndexBuffer.cpp" /> <ClCompile Include="renderer\IndexBuffer.cpp" />
<ClCompile Include="renderer\IndexBuffer9.cpp" />
<ClCompile Include="renderer\IndexDataManager.cpp" /> <ClCompile Include="renderer\IndexDataManager.cpp" />
<ClCompile Include="renderer\ImageSSE2.cpp" /> <ClCompile Include="renderer\ImageSSE2.cpp" />
<ClCompile Include="renderer\Image11.cpp" /> <ClCompile Include="renderer\Image11.cpp" />
...@@ -301,6 +302,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\" ...@@ -301,6 +302,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClInclude Include="renderer\Image11.h" /> <ClInclude Include="renderer\Image11.h" />
<ClInclude Include="renderer\Image9.h" /> <ClInclude Include="renderer\Image9.h" />
<ClInclude Include="renderer\IndexBuffer.h" /> <ClInclude Include="renderer\IndexBuffer.h" />
<ClInclude Include="renderer\IndexBuffer9.h" />
<ClInclude Include="renderer\IndexDataManager.h" /> <ClInclude Include="renderer\IndexDataManager.h" />
<ClInclude Include="renderer\Renderer.h" /> <ClInclude Include="renderer\Renderer.h" />
<ClInclude Include="renderer\Renderer11.h" /> <ClInclude Include="renderer\Renderer11.h" />
......
...@@ -155,6 +155,9 @@ ...@@ -155,6 +155,9 @@
<ClCompile Include="renderer\IndexBuffer.cpp"> <ClCompile Include="renderer\IndexBuffer.cpp">
<Filter>Renderer</Filter> <Filter>Renderer</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="renderer\IndexBuffer9.cpp">
<Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="renderer\Image11.cpp"> <ClCompile Include="renderer\Image11.cpp">
<Filter>Renderer</Filter> <Filter>Renderer</Filter>
</ClCompile> </ClCompile>
...@@ -325,6 +328,9 @@ ...@@ -325,6 +328,9 @@
<ClInclude Include="renderer\IndexBuffer.h"> <ClInclude Include="renderer\IndexBuffer.h">
<Filter>Renderer</Filter> <Filter>Renderer</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="renderer\IndexBuffer9.h">
<Filter>Renderer</Filter>
</ClInclude>
<ClInclude Include="renderer\Image11.h"> <ClInclude Include="renderer\Image11.h">
<Filter>Renderer</Filter> <Filter>Renderer</Filter>
</ClInclude> </ClInclude>
......
//
// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Indexffer9.cpp: Defines the D3D9 IndexBuffer implementation.
#include "libGLESv2/renderer/IndexBuffer9.h"
namespace rx
{
IndexBuffer9::IndexBuffer9(Renderer9 *const renderer) : mRenderer(renderer)
{
mIndexBuffer = NULL;
mBufferSize = 0;
mIndexType = 0;
mDynamic = false;
}
IndexBuffer9::~IndexBuffer9()
{
if (mIndexBuffer)
{
mIndexBuffer->Release();
mIndexBuffer = NULL;
}
}
bool IndexBuffer9::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
{
if (mIndexBuffer)
{
mIndexBuffer->Release();
mIndexBuffer = NULL;
}
updateSerial();
if (bufferSize > 0)
{
D3DFORMAT format;
if (indexType == GL_UNSIGNED_SHORT || indexType == GL_UNSIGNED_BYTE)
{
format = D3DFMT_INDEX16;
}
else if (indexType == GL_UNSIGNED_INT)
{
if (mRenderer->get32BitIndexSupport())
{
format = D3DFMT_INDEX32;
}
else
{
ERR("Attempted to create a 32-bit index buffer but renderer does not support 32-bit indices.");
return false;
}
}
else
{
ERR("Invalid index type %u.", indexType);
return false;
}
DWORD usageFlags = D3DUSAGE_WRITEONLY;
if (dynamic)
{
usageFlags |= D3DUSAGE_DYNAMIC;
}
HRESULT result = mRenderer->createIndexBuffer(bufferSize, usageFlags, format, &mIndexBuffer);
if (FAILED(result))
{
ERR("Failed to create an index buffer of size %u, result: 0x%08x.", mBufferSize, result);
return false;
}
}
mBufferSize = bufferSize;
mIndexType = indexType;
mDynamic = dynamic;
return true;
}
IndexBuffer9 *IndexBuffer9::makeIndexBuffer9(IndexBuffer *indexBuffer)
{
ASSERT(dynamic_cast<IndexBuffer9*>(indexBuffer) != NULL);
return static_cast<IndexBuffer9*>(indexBuffer);
}
bool IndexBuffer9::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
{
if (mIndexBuffer)
{
DWORD lockFlags = mDynamic ? D3DLOCK_NOOVERWRITE : 0;
void *mapPtr = NULL;
HRESULT result = mIndexBuffer->Lock(offset, size, &mapPtr, lockFlags);
if (FAILED(result))
{
ERR("Index buffer lock failed with error 0x%08x", result);
return false;
}
*outMappedMemory = mapPtr;
return true;
}
else
{
ERR("Index buffer not initialized.");
return false;
}
}
bool IndexBuffer9::unmapBuffer()
{
if (mIndexBuffer)
{
HRESULT result = mIndexBuffer->Unlock();
if (FAILED(result))
{
ERR("Index buffer unlock failed with error 0x%08x", result);
return false;
}
return true;
}
else
{
ERR("Index buffer not initialized.");
return false;
}
}
GLenum IndexBuffer9::getIndexType() const
{
return mIndexType;
}
unsigned int IndexBuffer9::getBufferSize() const
{
return mBufferSize;
}
bool IndexBuffer9::setSize(unsigned int bufferSize, GLenum indexType)
{
if (bufferSize > mBufferSize || indexType != mIndexType)
{
return initialize(bufferSize, indexType, mDynamic);
}
else
{
return true;
}
}
bool IndexBuffer9::discard()
{
if (mIndexBuffer)
{
void *dummy;
HRESULT result;
result = mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD);
if (FAILED(result))
{
ERR("Discard lock failed with error 0x%08x", result);
return false;
}
result = mIndexBuffer->Unlock();
if (FAILED(result))
{
ERR("Discard unlock failed with error 0x%08x", result);
return false;
}
return true;
}
else
{
ERR("Index buffer not initialized.");
return false;
}
}
D3DFORMAT IndexBuffer9::getIndexFormat() const
{
switch (mIndexType)
{
case GL_UNSIGNED_BYTE: return D3DFMT_INDEX16;
case GL_UNSIGNED_SHORT: return D3DFMT_INDEX16;
case GL_UNSIGNED_INT: return D3DFMT_INDEX32;
default: UNREACHABLE(); return D3DFMT_UNKNOWN;
}
}
IDirect3DIndexBuffer9 * IndexBuffer9::getBuffer() const
{
return mIndexBuffer;
}
}
\ No newline at end of file
//
// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Indexffer9.h: Defines the D3D9 IndexBuffer implementation.
#ifndef LIBGLESV2_RENDERER_INDEXBUFFER9_H_
#define LIBGLESV2_RENDERER_INDEXBUFFER9_H_
#include "libGLESv2/renderer/IndexBuffer.h"
#include "libGLESv2/renderer/Renderer9.h"
#include <d3d9.h>
namespace rx
{
class IndexBuffer9 : public IndexBuffer
{
public:
explicit IndexBuffer9(Renderer9 *const renderer);
virtual ~IndexBuffer9();
virtual bool initialize(unsigned int bufferSize, GLenum indexType, bool dynamic);
static IndexBuffer9 *makeIndexBuffer9(IndexBuffer *indexBuffer);
virtual bool mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory);
virtual bool unmapBuffer();
virtual GLenum getIndexType() const;
virtual unsigned int getBufferSize() const;
virtual bool setSize(unsigned int bufferSize, GLenum indexType);
virtual bool discard();
D3DFORMAT getIndexFormat() const;
IDirect3DIndexBuffer9 *getBuffer() const;
private:
DISALLOW_COPY_AND_ASSIGN(IndexBuffer9);
rx::Renderer9 *const mRenderer;
IDirect3DIndexBuffer9 *mIndexBuffer;
unsigned int mBufferSize;
GLenum mIndexType;
bool mDynamic;
};
}
#endif // LIBGLESV2_RENDERER_INDEXBUFFER9_H_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment