[vlc-devel] [PATCH 1/5] direct3d11: use a different vertex shader per quad

Steve Lhomme robux4 at videolabs.io
Mon Nov 21 17:55:10 CET 2016


The SPU need the flat vertex shader but others may need different shaders.
---
 modules/video_output/win32/common.h     |   2 +
 modules/video_output/win32/direct3d11.c | 102 +++++++++++++++++---------------
 2 files changed, 57 insertions(+), 47 deletions(-)

diff --git a/modules/video_output/win32/common.h b/modules/video_output/win32/common.h
index 5190fab..c9eceaf 100644
--- a/modules/video_output/win32/common.h
+++ b/modules/video_output/win32/common.h
@@ -62,6 +62,8 @@ typedef struct
 {
     ID3D11Buffer              *pVertexBuffer;
     UINT                      vertexCount;
+    ID3D11VertexShader        *d3dvertexShader;
+    ID3D11InputLayout         *pVertexLayout;
     ID3D11Buffer              *pIndexBuffer;
     UINT                      indexCount;
     ID3D11Texture2D           *pTexture;
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 23703b9..17499fc 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -909,15 +909,21 @@ static void DisplayD3DPicture(vout_display_sys_t *sys, d3d_quad_t *quad)
     UINT offset = 0;
 
     /* Render the quad */
-    ID3D11DeviceContext_RSSetViewports(sys->d3dcontext, 1, &quad->cropViewport);
+    /* vertex shader */
+    ID3D11DeviceContext_IASetVertexBuffers(sys->d3dcontext, 0, 1, &quad->pVertexBuffer, &stride, &offset);
+    ID3D11DeviceContext_IASetIndexBuffer(sys->d3dcontext, quad->pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
+
+    ID3D11DeviceContext_VSSetShader(sys->d3dcontext, quad->d3dvertexShader, NULL, 0);
+    ID3D11DeviceContext_IASetInputLayout(sys->d3dcontext, quad->pVertexLayout);
+
+    /* pixel shader */
     ID3D11DeviceContext_PSSetShader(sys->d3dcontext, quad->d3dpixelShader, NULL, 0);
     ID3D11DeviceContext_PSSetShaderResources(sys->d3dcontext, 0, 1, &quad->d3dresViewY);
-
     if( quad->d3dresViewUV )
         ID3D11DeviceContext_PSSetShaderResources(sys->d3dcontext, 1, 1, &quad->d3dresViewUV);
 
-    ID3D11DeviceContext_IASetVertexBuffers(sys->d3dcontext, 0, 1, &quad->pVertexBuffer, &stride, &offset);
-    ID3D11DeviceContext_IASetIndexBuffer(sys->d3dcontext, quad->pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
+    ID3D11DeviceContext_RSSetViewports(sys->d3dcontext, 1, &quad->cropViewport);
+
     ID3D11DeviceContext_DrawIndexed(sys->d3dcontext, quad->indexCount, 0, 0);
 }
 
@@ -1474,49 +1480,6 @@ static int Direct3D11CreateResources(vout_display_t *vd, video_format_t *fmt)
         ID3D11DepthStencilState_Release(pDepthStencilState);
     }
 
-    ID3DBlob* pVSBlob = NULL;
-
-    /* TODO : Match the version to the D3D_FEATURE_LEVEL */
-    hr = D3DCompile(globVertexShaderDefault, strlen(globVertexShaderDefault),
-                    NULL, NULL, NULL, "VS", "vs_4_0_level_9_1", 0, 0, &pVSBlob, NULL);
-
-    if( FAILED(hr)) {
-      msg_Err(vd, "The Vertex Shader is invalid. (hr=0x%lX)", hr);
-      return VLC_EGENERIC;
-    }
-
-    ID3D11VertexShader *d3dvertexShader;
-    hr = ID3D11Device_CreateVertexShader(sys->d3ddevice, (void *)ID3D10Blob_GetBufferPointer(pVSBlob),
-                                        ID3D10Blob_GetBufferSize(pVSBlob), NULL, &d3dvertexShader);
-
-    if(FAILED(hr)) {
-      ID3D11Device_Release(pVSBlob);
-      msg_Err(vd, "Failed to create the vertex shader. (hr=0x%lX)", hr);
-      return VLC_EGENERIC;
-    }
-    ID3D11DeviceContext_VSSetShader(sys->d3dcontext, d3dvertexShader, NULL, 0);
-    ID3D11VertexShader_Release(d3dvertexShader);
-
-    D3D11_INPUT_ELEMENT_DESC layout[] = {
-    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0},
-    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,    0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
-    { "OPACITY",  0, DXGI_FORMAT_R32_FLOAT,       0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0},
-    };
-
-    ID3D11InputLayout* pVertexLayout = NULL;
-    hr = ID3D11Device_CreateInputLayout(sys->d3ddevice, layout, 3, (void *)ID3D10Blob_GetBufferPointer(pVSBlob),
-                                        ID3D10Blob_GetBufferSize(pVSBlob), &pVertexLayout);
-
-    ID3D10Blob_Release(pVSBlob);
-
-    if(FAILED(hr)) {
-      msg_Err(vd, "Failed to create the vertex input layout. (hr=0x%lX)", hr);
-      return VLC_EGENERIC;
-    }
-
-    ID3D11DeviceContext_IASetInputLayout(sys->d3dcontext, pVertexLayout);
-    ID3D11SamplerState_Release(pVertexLayout);
-
     ID3D11DeviceContext_IASetPrimitiveTopology(sys->d3dcontext, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
 
     ID3DBlob* pPSBlob = NULL;
@@ -1698,6 +1661,41 @@ static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t *
         goto error;
     }
 
+    ID3DBlob* pVSBlob = NULL;
+    /* TODO : Match the version to the D3D_FEATURE_LEVEL */
+    hr = D3DCompile(globVertexShaderDefault, strlen(globVertexShaderDefault),
+                    NULL, NULL, NULL, "VS", "vs_4_0_level_9_1", 0, 0, &pVSBlob, NULL);
+
+    if( FAILED(hr)) {
+      msg_Err(vd, "The Vertex Shader is invalid. (hr=0x%lX)", hr);
+      goto error;
+    }
+
+    D3D11_INPUT_ELEMENT_DESC layout[] = {
+    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0},
+    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,    0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
+    { "OPACITY",  0, DXGI_FORMAT_R32_FLOAT,       0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0},
+    };
+
+    hr = ID3D11Device_CreateInputLayout(sys->d3ddevice, layout, 3, (void *)ID3D10Blob_GetBufferPointer(pVSBlob),
+                                        ID3D10Blob_GetBufferSize(pVSBlob), &quad->pVertexLayout);
+
+    ID3D10Blob_Release(pVSBlob);
+
+    if(FAILED(hr)) {
+      msg_Err(vd, "Failed to create the vertex input layout. (hr=0x%lX)", hr);
+      goto error;
+    }
+
+    hr = ID3D11Device_CreateVertexShader(sys->d3ddevice, (void *)ID3D10Blob_GetBufferPointer(pVSBlob),
+                                        ID3D10Blob_GetBufferSize(pVSBlob), NULL, &quad->d3dvertexShader);
+
+    if(FAILED(hr)) {
+      ID3D11Device_Release(pVSBlob);
+      msg_Err(vd, "Failed to create the vertex shader. (hr=0x%lX)", hr);
+      goto error;
+    }
+
     D3D11_TEXTURE2D_DESC texDesc;
     memset(&texDesc, 0, sizeof(texDesc));
     texDesc.Width  = b_visible ? fmt->i_visible_width  : fmt->i_width;
@@ -1854,6 +1852,16 @@ static void ReleaseQuad(d3d_quad_t *quad)
         ID3D11Buffer_Release(quad->pVertexBuffer);
         quad->pVertexBuffer = NULL;
     }
+    if (quad->d3dvertexShader)
+    {
+        ID3D11VertexShader_Release(quad->d3dvertexShader);
+        quad->d3dvertexShader = NULL;
+    }
+    if (quad->pVertexLayout)
+    {
+        ID3D11SamplerState_Release(quad->pVertexLayout);
+        quad->pVertexLayout = NULL;
+    }
     if (quad->pIndexBuffer)
     {
         ID3D11Buffer_Release(quad->pIndexBuffer);
-- 
2.10.1



More information about the vlc-devel mailing list