Browse Source

Use a reinterpret-cast trick to eliminate code duplication from Graphics::SetVertexBuffers(). Removed D3DCOMPILER_STRIP_PRIVATE_DATA flag as it may be undefined when compiling using the DirectX SDK.

Lasse Öörni 10 years ago
parent
commit
7716b4860c

+ 1 - 59
Source/Urho3D/Graphics/Direct3D11/D3D11Graphics.cpp

@@ -945,65 +945,7 @@ bool Graphics::SetVertexBuffers(const PODVector<VertexBuffer*>& buffers, const P
 bool Graphics::SetVertexBuffers(const Vector<SharedPtr<VertexBuffer> >& buffers, const PODVector<unsigned>&
 bool Graphics::SetVertexBuffers(const Vector<SharedPtr<VertexBuffer> >& buffers, const PODVector<unsigned>&
     elementMasks, unsigned instanceOffset)
     elementMasks, unsigned instanceOffset)
 {
 {
-    if (buffers.Size() > MAX_VERTEX_STREAMS)
-    {
-        LOGERROR("Too many vertex buffers");
-        return false;
-    }
-    if (buffers.Size() != elementMasks.Size())
-    {
-        LOGERROR("Amount of element masks and vertex buffers does not match");
-        return false;
-    }
-    
-    for (unsigned i = 0; i < MAX_VERTEX_STREAMS; ++i)
-    {
-        VertexBuffer* buffer = 0;
-        bool changed = false;
-
-        buffer = i < buffers.Size() ? buffers[i].Get() : 0;
-        if (buffer)
-        {
-            unsigned elementMask = buffer->GetElementMask() & elementMasks[i];
-            unsigned offset = (elementMask & MASK_INSTANCEMATRIX1) ? instanceOffset * buffer->GetVertexSize() : 0;
-
-            if (buffer != vertexBuffers_[i] || elementMask != elementMasks_[i] || offset != impl_->vertexOffsets_[i])
-            {
-                vertexBuffers_[i] = buffer;
-                elementMasks_[i] = elementMask;
-                impl_->vertexBuffers_[i] = (ID3D11Buffer*)buffer->GetGPUObject();
-                impl_->vertexSizes_[i] = buffer->GetVertexSize();
-                impl_->vertexOffsets_[i] = offset;
-                changed = true;
-            }
-        }
-        else if (vertexBuffers_[i])
-        {
-            vertexBuffers_[i] = 0;
-            elementMasks_[i] = 0;
-            impl_->vertexBuffers_[i] = 0;
-            impl_->vertexSizes_[i] = 0;
-            impl_->vertexOffsets_[i] = 0;
-            changed = true;
-        }
-
-        if (changed)
-        {
-            vertexDeclarationDirty_ = true;
-
-            if (firstDirtyVB_ == M_MAX_UNSIGNED)
-                firstDirtyVB_ = lastDirtyVB_ = i;
-            else
-            {
-                if (i < firstDirtyVB_)
-                    firstDirtyVB_ = i;
-                if (i > lastDirtyVB_)
-                    lastDirtyVB_ = i;
-            }
-        }
-    }
-    
-    return true;
+    return SetVertexBuffers(reinterpret_cast<const PODVector<VertexBuffer*>&>(buffers), elementMasks, instanceOffset);
 }
 }
 
 
 void Graphics::SetIndexBuffer(IndexBuffer* buffer)
 void Graphics::SetIndexBuffer(IndexBuffer* buffer)

+ 1 - 1
Source/Urho3D/Graphics/Direct3D11/D3D11ShaderVariation.cpp

@@ -310,7 +310,7 @@ bool ShaderVariation::Compile()
         // Then strip everything not necessary to use the shader
         // Then strip everything not necessary to use the shader
         ID3DBlob* strippedCode = 0;
         ID3DBlob* strippedCode = 0;
         D3DStripShader(bufData, bufSize, D3DCOMPILER_STRIP_REFLECTION_DATA | D3DCOMPILER_STRIP_DEBUG_INFO |
         D3DStripShader(bufData, bufSize, D3DCOMPILER_STRIP_REFLECTION_DATA | D3DCOMPILER_STRIP_DEBUG_INFO |
-            D3DCOMPILER_STRIP_TEST_BLOBS | D3DCOMPILER_STRIP_PRIVATE_DATA, &strippedCode);
+            D3DCOMPILER_STRIP_TEST_BLOBS, &strippedCode);
         byteCode_.Resize(strippedCode->GetBufferSize());
         byteCode_.Resize(strippedCode->GetBufferSize());
         memcpy(&byteCode_[0], strippedCode->GetBufferPointer(), byteCode_.Size());
         memcpy(&byteCode_[0], strippedCode->GetBufferPointer(), byteCode_.Size());
         strippedCode->Release();
         strippedCode->Release();

+ 1 - 67
Source/Urho3D/Graphics/Direct3D9/D3D9Graphics.cpp

@@ -1014,73 +1014,7 @@ bool Graphics::SetVertexBuffers(const PODVector<VertexBuffer*>& buffers, const P
 bool Graphics::SetVertexBuffers(const Vector<SharedPtr<VertexBuffer> >& buffers, const PODVector<unsigned>&
 bool Graphics::SetVertexBuffers(const Vector<SharedPtr<VertexBuffer> >& buffers, const PODVector<unsigned>&
     elementMasks, unsigned instanceOffset)
     elementMasks, unsigned instanceOffset)
 {
 {
-    if (buffers.Size() > MAX_VERTEX_STREAMS)
-    {
-        LOGERROR("Too many vertex buffers");
-        return false;
-    }
-    if (buffers.Size() != elementMasks.Size())
-    {
-        LOGERROR("Amount of element masks and vertex buffers does not match");
-        return false;
-    }
-    
-    unsigned long long hash = 0;
-    for (unsigned i = 0; i < buffers.Size(); ++i)
-    {
-        if (!buffers[i])
-            continue;
-        
-        hash |= buffers[i]->GetBufferHash(i, elementMasks[i]);
-    }
-    
-    if (hash)
-    {
-        if (!vertexDeclarations_.Contains(hash))
-        {
-            SharedPtr<VertexDeclaration> newDeclaration(new VertexDeclaration(this, buffers, elementMasks));
-            if (!newDeclaration->GetDeclaration())
-            {
-                LOGERROR("Failed to create vertex declaration");
-                return false;
-            }
-            
-            vertexDeclarations_[hash] = newDeclaration;
-        }
-        
-        VertexDeclaration* declaration = vertexDeclarations_[hash];
-        if (declaration != vertexDeclaration_)
-        {
-            impl_->device_->SetVertexDeclaration(declaration->GetDeclaration());
-            vertexDeclaration_ = declaration;
-        }
-    }
-    
-    for (unsigned i = 0; i < MAX_VERTEX_STREAMS; ++i)
-    {
-        VertexBuffer* buffer = 0;
-        unsigned offset = 0;
-        
-        if (i < buffers.Size())
-        {
-            buffer = buffers[i];
-            if (buffer && buffer->GetElementMask() & MASK_INSTANCEMATRIX1)
-                offset = instanceOffset * buffer->GetVertexSize();
-        }
-        
-        if (buffer != vertexBuffers_[i] || offset != streamOffsets_[i])
-        {
-            if (buffer)
-                impl_->device_->SetStreamSource(i, (IDirect3DVertexBuffer9*)buffer->GetGPUObject(), offset, buffer->GetVertexSize());
-            else
-                impl_->device_->SetStreamSource(i, 0, 0, 0);
-            
-            vertexBuffers_[i] = buffer;
-            streamOffsets_[i] = offset;
-        }
-    }
-    
-    return true;
+    return SetVertexBuffers(reinterpret_cast<const PODVector<VertexBuffer*>&>(buffers), elementMasks, instanceOffset);
 }
 }
 
 
 void Graphics::SetIndexBuffer(IndexBuffer* buffer)
 void Graphics::SetIndexBuffer(IndexBuffer* buffer)

+ 1 - 93
Source/Urho3D/Graphics/OpenGL/OGLGraphics.cpp

@@ -995,99 +995,7 @@ bool Graphics::SetVertexBuffers(const PODVector<VertexBuffer*>& buffers, const P
 bool Graphics::SetVertexBuffers(const Vector<SharedPtr<VertexBuffer> >& buffers, const PODVector<unsigned>&
 bool Graphics::SetVertexBuffers(const Vector<SharedPtr<VertexBuffer> >& buffers, const PODVector<unsigned>&
     elementMasks, unsigned instanceOffset)
     elementMasks, unsigned instanceOffset)
 {
 {
-    if (buffers.Size() > MAX_VERTEX_STREAMS)
-    {
-        LOGERROR("Too many vertex buffers");
-        return false;
-    }
-    if (buffers.Size() != elementMasks.Size())
-    {
-        LOGERROR("Amount of element masks and vertex buffers does not match");
-        return false;
-    }
-    
-    bool changed = false;
-    unsigned newAttributes = 0;
-    
-    for (unsigned i = 0; i < MAX_VERTEX_STREAMS; ++i)
-    {
-        VertexBuffer* buffer = 0;
-        unsigned elementMask = 0;
-        
-        if (i < buffers.Size() && buffers[i])
-        {
-            buffer = buffers[i];
-            if (elementMasks[i] == MASK_DEFAULT)
-                elementMask = buffer->GetElementMask();
-            else
-                elementMask = buffer->GetElementMask() & elementMasks[i];
-        }
-        
-        // If buffer and element mask have stayed the same, skip to the next buffer
-        if (buffer == vertexBuffers_[i] && elementMask == elementMasks_[i] && instanceOffset == lastInstanceOffset_ && !changed)
-        {
-            newAttributes |= elementMask;
-            continue;
-        }
-        
-        vertexBuffers_[i] = buffer;
-        elementMasks_[i] = elementMask;
-        changed = true;
-        
-        // Beware buffers with missing OpenGL objects, as binding a zero buffer object means accessing CPU memory for vertex data,
-        // in which case the pointer will be invalid and cause a crash
-        if (!buffer || !buffer->GetGPUObject())
-            continue;
-        
-        SetVBO(buffer->GetGPUObject());
-        unsigned vertexSize = buffer->GetVertexSize();
-        
-        for (unsigned j = 0; j < MAX_VERTEX_ELEMENTS; ++j)
-        {
-            unsigned attrIndex = glVertexAttrIndex[j];
-            unsigned elementBit = 1 << j;
-            
-            if (elementMask & elementBit)
-            {
-                newAttributes |= elementBit;
-                
-                // Enable attribute if not enabled yet
-                if ((impl_->enabledAttributes_ & elementBit) == 0)
-                {
-                    glEnableVertexAttribArray(attrIndex);
-                    impl_->enabledAttributes_ |= elementBit;
-                }
-                
-                // Set the attribute pointer. Add instance offset for the instance matrix pointers
-                unsigned offset = j >= ELEMENT_INSTANCEMATRIX1 ? instanceOffset * vertexSize : 0;
-                glVertexAttribPointer(attrIndex, VertexBuffer::elementComponents[j], VertexBuffer::elementType[j],
-                    VertexBuffer::elementNormalize[j], vertexSize, reinterpret_cast<const GLvoid*>(buffer->GetElementOffset((VertexElement)j)
-                    + offset));
-            }
-        }
-    }
-    
-    if (!changed)
-        return true;
-    
-    lastInstanceOffset_ = instanceOffset;
-    
-    // Now check which vertex attributes should be disabled
-    unsigned disableAttributes = impl_->enabledAttributes_ & (~newAttributes);
-    unsigned disableIndex = 0;
-    
-    while (disableAttributes)
-    {
-        if (disableAttributes & 1)
-        {
-            glDisableVertexAttribArray(glVertexAttrIndex[disableIndex]);
-            impl_->enabledAttributes_ &= ~(1 << disableIndex);
-        }
-        disableAttributes >>= 1;
-        ++disableIndex;
-    }
-    
-    return true;
+    return SetVertexBuffers(reinterpret_cast<const PODVector<VertexBuffer*>&>(buffers), elementMasks, instanceOffset);
 }
 }
 
 
 void Graphics::SetIndexBuffer(IndexBuffer* buffer)
 void Graphics::SetIndexBuffer(IndexBuffer* buffer)