Eliminate lookupAttributeMapping.

TRAC #14871 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@612 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 2cec2f3a
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
namespace gl namespace gl
{ {
Context::Context(const egl::Config *config, const gl::Context *shareContext) Context::Context(const egl::Config *config, const gl::Context *shareContext)
: mConfig(config) : mConfig(config), mMaxLru(0)
{ {
setClearColor(0.0f, 0.0f, 0.0f, 0.0f); setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
...@@ -154,6 +154,12 @@ Context::Context(const egl::Config *config, const gl::Context *shareContext) ...@@ -154,6 +154,12 @@ Context::Context(const egl::Config *config, const gl::Context *shareContext)
mMaxSupportedSamples = 0; mMaxSupportedSamples = 0;
mMaskedClearSavedState = NULL; mMaskedClearSavedState = NULL;
markAllStateDirty(); markAllStateDirty();
for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
{
mVertexDeclCache[i].vertexDeclaration = NULL;
mVertexDeclCache[i].lruCount = 0;
}
} }
Context::~Context() Context::~Context()
...@@ -219,6 +225,14 @@ Context::~Context() ...@@ -219,6 +225,14 @@ Context::~Context()
} }
mResourceManager->release(); mResourceManager->release();
for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
{
if (mVertexDeclCache[i].vertexDeclaration)
{
mVertexDeclCache[i].vertexDeclaration->Release();
}
}
} }
void Context::makeCurrent(egl::Display *display, egl::Surface *surface) void Context::makeCurrent(egl::Display *display, egl::Surface *surface)
...@@ -1953,31 +1967,72 @@ void Context::applyState(GLenum drawMode) ...@@ -1953,31 +1967,72 @@ void Context::applyState(GLenum drawMode)
mFrontFaceDirty = false; mFrontFaceDirty = false;
} }
// Fill in the semanticIndex field of the array of TranslatedAttributes based on the active GLSL program. GLenum Context::applyVertexBuffer(GLint first, GLsizei count)
void Context::lookupAttributeMapping(TranslatedAttribute *attributes)
{ {
TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS];
GLenum err = mVertexDataManager->prepareVertexData(first, count, attributes);
if (err != GL_NO_ERROR)
{
return err;
}
IDirect3DDevice9 *device = getDevice();
Program *program = getCurrentProgram();
D3DVERTEXELEMENT9 elements[MAX_VERTEX_ATTRIBS + 1];
D3DVERTEXELEMENT9 *element = &elements[0];
for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++) for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
{ {
if (attributes[i].active) if (attributes[i].active)
{ {
attributes[i].semanticIndex = getCurrentProgram()->getSemanticIndex(i); device->SetStreamSource(i, attributes[i].vertexBuffer, attributes[i].offset, attributes[i].stride);
element->Stream = i;
element->Offset = 0;
element->Type = attributes[i].type;
element->Method = D3DDECLMETHOD_DEFAULT;
element->Usage = D3DDECLUSAGE_TEXCOORD;
element->UsageIndex = program->getSemanticIndex(i);
element++;
} }
} }
}
GLenum Context::applyVertexBuffer(GLint first, GLsizei count) static const D3DVERTEXELEMENT9 end = D3DDECL_END();
{ *(element++) = end;
TranslatedAttribute translated[MAX_VERTEX_ATTRIBS];
GLenum err = mVertexDataManager->prepareVertexData(first, count, translated); for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
if (err != GL_NO_ERROR)
{ {
return err; VertexDeclCacheEntry *entry = &mVertexDeclCache[i];
if (memcmp(entry->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9)) == 0 && entry->vertexDeclaration)
{
entry->lruCount = ++mMaxLru;
device->SetVertexDeclaration(entry->vertexDeclaration);
return GL_NO_ERROR;
}
} }
lookupAttributeMapping(translated); VertexDeclCacheEntry *lastCache = mVertexDeclCache;
for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
{
if (mVertexDeclCache[i].lruCount < lastCache->lruCount)
{
lastCache = &mVertexDeclCache[i];
}
}
if (lastCache->vertexDeclaration != NULL)
{
lastCache->vertexDeclaration->Release();
lastCache->vertexDeclaration = NULL;
}
mVertexDataManager->setupAttributes(translated); memcpy(lastCache->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9));
device->CreateVertexDeclaration(elements, &lastCache->vertexDeclaration);
device->SetVertexDeclaration(lastCache->vertexDeclaration);
lastCache->lruCount = ++mMaxLru;
return GL_NO_ERROR; return GL_NO_ERROR;
} }
......
...@@ -439,8 +439,6 @@ class Context ...@@ -439,8 +439,6 @@ class Context
private: private:
DISALLOW_COPY_AND_ASSIGN(Context); DISALLOW_COPY_AND_ASSIGN(Context);
void lookupAttributeMapping(TranslatedAttribute *attributes);
void detachBuffer(GLuint buffer); void detachBuffer(GLuint buffer);
void detachTexture(GLuint texture); void detachTexture(GLuint texture);
void detachFramebuffer(GLuint framebuffer); void detachFramebuffer(GLuint framebuffer);
...@@ -453,7 +451,7 @@ class Context ...@@ -453,7 +451,7 @@ class Context
const egl::Config *const mConfig; const egl::Config *const mConfig;
State mState; State mState;
BindingPointer<Texture2D> mTexture2DZero; BindingPointer<Texture2D> mTexture2DZero;
BindingPointer<TextureCubeMap> mTextureCubeMapZero; BindingPointer<TextureCubeMap> mTextureCubeMapZero;
...@@ -528,6 +526,17 @@ class Context ...@@ -528,6 +526,17 @@ class Context
D3DCAPS9 mDeviceCaps; D3DCAPS9 mDeviceCaps;
ResourceManager *mResourceManager; ResourceManager *mResourceManager;
UINT mMaxLru;
enum { NUM_VERTEX_DECL_CACHE_ENTRIES = 16 };
struct VertexDeclCacheEntry
{
D3DVERTEXELEMENT9 cachedElements[MAX_VERTEX_ATTRIBS + 1];
UINT lruCount;
IDirect3DVertexDeclaration9 *vertexDeclaration;
} mVertexDeclCache[NUM_VERTEX_DECL_CACHE_ENTRIES];
}; };
} }
......
...@@ -26,18 +26,13 @@ namespace ...@@ -26,18 +26,13 @@ namespace
namespace gl namespace gl
{ {
VertexDataManager::VertexDataManager(Context *context, IDirect3DDevice9 *device) : mContext(context), mDevice(device), mMaxLru(0) VertexDataManager::VertexDataManager(Context *context, IDirect3DDevice9 *device) : mContext(context), mDevice(device)
{ {
for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++) for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
{ {
mDirtyCurrentValue[i] = true; mDirtyCurrentValue[i] = true;
mCurrentValueBuffer[i] = NULL; mCurrentValueBuffer[i] = NULL;
} }
for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
{
mVertexDeclCache[i].vertexDeclaration = NULL;
mVertexDeclCache[i].lruCount = 0;
}
const D3DCAPS9 &caps = context->getDeviceCaps(); const D3DCAPS9 &caps = context->getDeviceCaps();
checkVertexCaps(caps.DeclTypes); checkVertexCaps(caps.DeclTypes);
...@@ -53,13 +48,6 @@ VertexDataManager::~VertexDataManager() ...@@ -53,13 +48,6 @@ VertexDataManager::~VertexDataManager()
{ {
delete mCurrentValueBuffer[i]; delete mCurrentValueBuffer[i];
} }
for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
{
if (mVertexDeclCache[i].vertexDeclaration)
{
mVertexDeclCache[i].vertexDeclaration->Release();
}
}
} }
UINT VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute) UINT VertexDataManager::writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute)
...@@ -519,63 +507,6 @@ unsigned int VertexDataManager::typeIndex(GLenum type) const ...@@ -519,63 +507,6 @@ unsigned int VertexDataManager::typeIndex(GLenum type) const
} }
} }
void VertexDataManager::setupAttributes(const TranslatedAttribute *attributes)
{
D3DVERTEXELEMENT9 elements[MAX_VERTEX_ATTRIBS + 1];
D3DVERTEXELEMENT9 *element = &elements[0];
for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
{
if (attributes[i].active)
{
mDevice->SetStreamSource(i, attributes[i].vertexBuffer, attributes[i].offset, attributes[i].stride);
element->Stream = i;
element->Offset = 0;
element->Type = attributes[i].type;
element->Method = D3DDECLMETHOD_DEFAULT;
element->Usage = D3DDECLUSAGE_TEXCOORD;
element->UsageIndex = attributes[i].semanticIndex;
element++;
}
}
static const D3DVERTEXELEMENT9 end = D3DDECL_END();
*(element++) = end;
for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
{
VertexDeclCacheEntry *entry = &mVertexDeclCache[i];
if (memcmp(entry->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9)) == 0 && entry->vertexDeclaration)
{
entry->lruCount = ++mMaxLru;
mDevice->SetVertexDeclaration(entry->vertexDeclaration);
return;
}
}
VertexDeclCacheEntry *lastCache = mVertexDeclCache;
for (int i = 0; i < NUM_VERTEX_DECL_CACHE_ENTRIES; i++)
{
if (mVertexDeclCache[i].lruCount < lastCache->lruCount)
{
lastCache = &mVertexDeclCache[i];
}
}
if (lastCache->vertexDeclaration != NULL)
{
lastCache->vertexDeclaration->Release();
lastCache->vertexDeclaration = NULL;
}
memcpy(lastCache->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9));
mDevice->CreateVertexDeclaration(elements, &lastCache->vertexDeclaration);
mDevice->SetVertexDeclaration(lastCache->vertexDeclaration);
lastCache->lruCount = ++mMaxLru;
}
VertexBuffer::VertexBuffer(IDirect3DDevice9 *device, std::size_t size, DWORD usageFlags) : mDevice(device), mVertexBuffer(NULL) VertexBuffer::VertexBuffer(IDirect3DDevice9 *device, std::size_t size, DWORD usageFlags) : mDevice(device), mVertexBuffer(NULL)
{ {
if (size > 0) if (size > 0)
......
...@@ -28,7 +28,6 @@ struct TranslatedAttribute ...@@ -28,7 +28,6 @@ struct TranslatedAttribute
D3DDECLTYPE type; D3DDECLTYPE type;
UINT offset; UINT offset;
UINT stride; // 0 means not to advance the read pointer at all UINT stride; // 0 means not to advance the read pointer at all
UINT semanticIndex;
IDirect3DVertexBuffer9 *vertexBuffer; IDirect3DVertexBuffer9 *vertexBuffer;
}; };
...@@ -119,7 +118,6 @@ class VertexDataManager ...@@ -119,7 +118,6 @@ class VertexDataManager
void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; } void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; }
void setupAttributes(const TranslatedAttribute *attributes);
GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs); GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs);
private: private:
...@@ -163,17 +161,6 @@ class VertexDataManager ...@@ -163,17 +161,6 @@ class VertexDataManager
unsigned int typeIndex(GLenum type) const; unsigned int typeIndex(GLenum type) const;
const FormatConverter &formatConverter(const VertexAttribute &attribute) const; const FormatConverter &formatConverter(const VertexAttribute &attribute) const;
UINT mMaxLru;
enum { NUM_VERTEX_DECL_CACHE_ENTRIES = 16 };
struct VertexDeclCacheEntry
{
D3DVERTEXELEMENT9 cachedElements[MAX_VERTEX_ATTRIBS + 1];
UINT lruCount;
IDirect3DVertexDeclaration9 *vertexDeclaration;
} mVertexDeclCache[NUM_VERTEX_DECL_CACHE_ENTRIES];
}; };
} }
......
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