aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Fedchin <afedchin@ruswizards.com>2015-07-07 16:25:28 +0300
committerAnton Fedchin <afedchin@ruswizards.com>2015-07-11 11:14:31 +0300
commitcf20b8d2c242be08d44797e521f84ae241a06232 (patch)
tree90110c9733ffe32ec927b02d7a380c866ae894cc
parent7bbde40292b299bca44c3a3a20a16da514f58e16 (diff)
[dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices.
-rw-r--r--xbmc/guilib/GUIShaderDX.cpp35
-rw-r--r--xbmc/guilib/GUIShaderDX.h4
2 files changed, 7 insertions, 32 deletions
diff --git a/xbmc/guilib/GUIShaderDX.cpp b/xbmc/guilib/GUIShaderDX.cpp
index b23acbba91..c745ba59c6 100644
--- a/xbmc/guilib/GUIShaderDX.cpp
+++ b/xbmc/guilib/GUIShaderDX.cpp
@@ -61,7 +61,6 @@ CGUIShaderDX::CGUIShaderDX() :
m_pVPBuffer(NULL),
m_pWVPBuffer(NULL),
m_pVertexBuffer(NULL),
- m_pIndexBuffer(NULL),
m_clipXFactor(0.0f),
m_clipXOffset(0.0f),
m_clipYFactor(0.0f),
@@ -125,28 +124,13 @@ bool CGUIShaderDX::CreateBuffers()
ID3D11Device* pDevice = g_Windowing.Get3D11Device();
// create vertex buffer
- CD3D11_BUFFER_DESC bufferDesc(sizeof(Vertex) * __RENDER_GUI_VERTICES_COUNT, D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
+ CD3D11_BUFFER_DESC bufferDesc(sizeof(Vertex) * 4, D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
if (FAILED(pDevice->CreateBuffer(&bufferDesc, NULL, &m_pVertexBuffer)))
{
CLog::Log(LOGERROR, __FUNCTION__ " - Failed to create GUI vertex buffer.");
return false;
}
- // create index buffer
- bufferDesc.ByteWidth = sizeof(uint16_t) * __RENDER_GUI_INDICES_COUNT;
- bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
- bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; // index buffer never change, so create it as static
- bufferDesc.CPUAccessFlags = 0;
-
- uint16_t quadIndices[] = { 2, 3, 0, 1, 2, 0, };
- D3D11_SUBRESOURCE_DATA initData = { 0 };
- initData.pSysMem = quadIndices;
- if (FAILED(pDevice->CreateBuffer(&bufferDesc, &initData, &m_pIndexBuffer)))
- {
- CLog::Log(LOGERROR, __FUNCTION__ " - Failed to create GUI index buffer.");
- return false;
- }
-
// Create the constant buffer for WVP
CD3D11_BUFFER_DESC cbbd(sizeof(XMMATRIX), D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); // it can change very frequently
if (FAILED(pDevice->CreateBuffer(&cbbd, NULL, &m_pWVPBuffer)))
@@ -166,8 +150,7 @@ bool CGUIShaderDX::CreateBuffers()
m_cbViewPort.Height = viewPort.Height();
cbbd.ByteWidth = sizeof(cbViewPort);
- initData.pSysMem = &m_cbViewPort;
-
+ D3D11_SUBRESOURCE_DATA initData = { &m_cbViewPort, 0, 0 };
// create viewport buffer
if (FAILED(pDevice->CreateBuffer(&cbbd, &initData, &m_pVPBuffer)))
return false;
@@ -252,13 +235,13 @@ void CGUIShaderDX::DrawQuad(Vertex& v1, Vertex& v2, Vertex& v3, Vertex& v4)
D3D11_MAPPED_SUBRESOURCE resource;
if (SUCCEEDED(pContext->Map(m_pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource)))
{
- Vertex verticies[] = { v1, v2, v3, v4 };
+ // we are using strip topology
+ Vertex verticies[4] = { v2, v3, v1, v4 };
memcpy(resource.pData, &verticies, sizeof(Vertex) * 4);
pContext->Unmap(m_pVertexBuffer, 0);
+ // Draw primitives
+ pContext->Draw(4, 0);
}
-
- // Draw primitives
- pContext->DrawIndexed(6, 0, 0);
}
void CGUIShaderDX::DrawIndexed(unsigned int indexCount, unsigned int startIndex, unsigned int startVertex)
@@ -297,7 +280,6 @@ void CGUIShaderDX::SetSampler(SHADER_SAMPLER sampler)
void CGUIShaderDX::Release()
{
- SAFE_RELEASE(m_pIndexBuffer);
SAFE_RELEASE(m_pVertexBuffer);
SAFE_RELEASE(m_pWVPBuffer);
SAFE_RELEASE(m_pVPBuffer);
@@ -389,13 +371,10 @@ void CGUIShaderDX::RestoreBuffers(void)
const unsigned offset = 0;
ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
-
// Set the vertex buffer to active in the input assembler so it can be rendered.
pContext->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &stride, &offset);
- // Set the index buffer to active in the input assembler so it can be rendered.
- pContext->IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
// Set the type of primitive that should be rendered from this vertex buffer, in this case triangles.
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
}
void CGUIShaderDX::ClipToScissorParams(void)
diff --git a/xbmc/guilib/GUIShaderDX.h b/xbmc/guilib/GUIShaderDX.h
index 12595e6e09..9bd0a12102 100644
--- a/xbmc/guilib/GUIShaderDX.h
+++ b/xbmc/guilib/GUIShaderDX.h
@@ -26,9 +26,6 @@
#include "D3DResource.h"
#include <DirectXMath.h>
-#define __RENDER_GUI_INDICES_COUNT 6
-#define __RENDER_GUI_VERTICES_COUNT 4
-
using namespace DirectX;
struct Vertex {
@@ -132,7 +129,6 @@ private:
ID3D11Buffer* m_pWVPBuffer;
ID3D11Buffer* m_pVPBuffer;
ID3D11Buffer* m_pVertexBuffer;
- ID3D11Buffer* m_pIndexBuffer;
bool m_bIsWVPDirty;
bool m_bIsVPDirty;