[vlc-commits] d3d11_quad: move the vertex input layout in the Quad

Steve Lhomme git at videolan.org
Wed Oct 17 16:07:32 CEST 2018


vlc/vlc-3.0 | branch: master | Steve Lhomme <robux4 at videolabs.io> | Thu Dec 21 18:35:22 2017 +0100| [1480cd7c2b3cdaff48f68907af721bb8334dec48] | committer: Steve Lhomme

d3d11_quad: move the vertex input layout in the Quad

(this is not necessary as long as we all use the same one on the same context)

(cherry picked from commit 5269cb157f237a2aa421761526f4d86493d97946)

> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=1480cd7c2b3cdaff48f68907af721bb8334dec48
---

 modules/video_output/win32/d3d11_quad.c |  6 +++++-
 modules/video_output/win32/d3d11_quad.h |  5 +++--
 modules/video_output/win32/direct3d11.c | 16 +++++++++-------
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/modules/video_output/win32/d3d11_quad.c b/modules/video_output/win32/d3d11_quad.c
index f05badb667..278516b9f4 100644
--- a/modules/video_output/win32/d3d11_quad.c
+++ b/modules/video_output/win32/d3d11_quad.c
@@ -50,7 +50,10 @@ void D3D11_RenderQuad(d3d11_device_t *d3d_dev, d3d_quad_t *quad,
     ID3D11DeviceContext_OMSetRenderTargets(d3d_dev->d3dcontext, 1, &d3drenderTargetView, NULL);
 
     /* Render the quad */
+    ID3D11DeviceContext_IASetPrimitiveTopology(d3d_dev->d3dcontext, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+
     /* vertex shader */
+    ID3D11DeviceContext_IASetInputLayout(d3d_dev->d3dcontext, quad->pVertexLayout);
     ID3D11DeviceContext_IASetVertexBuffers(d3d_dev->d3dcontext, 0, 1, &quad->pVertexBuffer, &quad->vertexStride, &offset);
     ID3D11DeviceContext_IASetIndexBuffer(d3d_dev->d3dcontext, quad->pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
     if ( quad->pVertexShaderConstants )
@@ -611,7 +614,7 @@ void D3D11_UpdateQuadLuminanceScale(vlc_object_t *o, d3d11_device_t *d3d_dev, d3
 #undef D3D11_SetupQuad
 int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format_t *fmt, d3d_quad_t *quad,
                     const display_info_t *displayFormat, const RECT *output,
-                    ID3D11VertexShader *d3dvertexShader,
+                    ID3D11VertexShader *d3dvertexShader, ID3D11InputLayout *pVertexLayout,
                     video_projection_mode_t projection, video_orientation_t orientation)
 {
     HRESULT hr;
@@ -772,6 +775,7 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format
         goto error;
 
     quad->d3dvertexShader = d3dvertexShader;
+    quad->pVertexLayout   = pVertexLayout;
     quad->resourceCount = DxgiResourceCount(quad->formatInfo);
 
     return VLC_SUCCESS;
diff --git a/modules/video_output/win32/d3d11_quad.h b/modules/video_output/win32/d3d11_quad.h
index 788b7a1c13..6297a23042 100644
--- a/modules/video_output/win32/d3d11_quad.h
+++ b/modules/video_output/win32/d3d11_quad.h
@@ -44,6 +44,7 @@ typedef struct
     ID3D11Buffer              *pPixelShaderConstants[2];
     UINT                       PSConstantsCount;
     ID3D11PixelShader         *d3dpixelShader;
+    ID3D11InputLayout         *pVertexLayout;
     D3D11_VIEWPORT            cropViewport;
     unsigned int              i_width;
     unsigned int              i_height;
@@ -73,9 +74,9 @@ void D3D11_ReleaseQuad(d3d_quad_t *);
 
 int D3D11_SetupQuad(vlc_object_t *, d3d11_device_t *, const video_format_t *, d3d_quad_t *,
                     const display_info_t *, const RECT *,
-                    ID3D11VertexShader *, video_projection_mode_t,
+                    ID3D11VertexShader *, ID3D11InputLayout *, video_projection_mode_t,
                     video_orientation_t);
-#define D3D11_SetupQuad(a,b,c,d,e,f,g,h,i)  D3D11_SetupQuad(VLC_OBJECT(a),b,c,d,e,f,g,h,i)
+#define D3D11_SetupQuad(a,b,c,d,e,f,g,h,i,j)  D3D11_SetupQuad(VLC_OBJECT(a),b,c,d,e,f,g,h,i,j)
 
 bool D3D11_UpdateQuadPosition( vlc_object_t *, d3d11_device_t *, d3d_quad_t *,
                                const RECT *output, video_orientation_t );
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 348d84fff3..aeb6c19f9a 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -105,6 +105,7 @@ struct vout_display_sys_t
     ID3D11RenderTargetView   *d3drenderTargetView;
     ID3D11DepthStencilView   *d3ddepthStencilView;
 
+    ID3D11InputLayout         *pVertexLayout;
     ID3D11VertexShader        *flatVSShader;
     ID3D11VertexShader        *projectionVSShader;
 
@@ -358,6 +359,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
 
     if (D3D11_SetupQuad( vd, &sys->d3d_dev, &surface_fmt, &sys->picQuad, &sys->display, &sys->sys.rect_src_clipped,
                    vd->fmt.projection_mode == PROJECTION_MODE_RECTANGULAR ? sys->flatVSShader : sys->projectionVSShader,
+                   sys->pVertexLayout,
                    surface_fmt.projection_mode, vd->fmt.orientation ) != VLC_SUCCESS) {
         msg_Err(vd, "Could not Create the main quad picture.");
         return NULL;
@@ -1598,9 +1600,8 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
     { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,    0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
     };
 
-    ID3D11InputLayout* pVertexLayout = NULL;
     hr = ID3D11Device_CreateInputLayout(sys->d3d_dev.d3ddevice, layout, 2, (void *)ID3D10Blob_GetBufferPointer(pVSBlob),
-                                        ID3D10Blob_GetBufferSize(pVSBlob), &pVertexLayout);
+                                        ID3D10Blob_GetBufferSize(pVSBlob), &sys->pVertexLayout);
 
     ID3D10Blob_Release(pVSBlob);
 
@@ -1608,8 +1609,6 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
       msg_Err(vd, "Failed to create the vertex input layout. (hr=0x%lX)", hr);
       return VLC_EGENERIC;
     }
-    ID3D11DeviceContext_IASetInputLayout(sys->d3d_dev.d3dcontext, pVertexLayout);
-    ID3D11InputLayout_Release(pVertexLayout);
 
     pVSBlob = D3D11_CompileShader(vd, &sys->hd3d, &sys->d3d_dev, globVertexShaderProjection, false);
     if (!pVSBlob)
@@ -1625,8 +1624,6 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
     }
     ID3D10Blob_Release(pVSBlob);
 
-    ID3D11DeviceContext_IASetPrimitiveTopology(sys->d3d_dev.d3dcontext, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
-
     UpdatePicQuadPosition(vd);
 
     D3D11_SAMPLER_DESC sampDesc;
@@ -1683,6 +1680,11 @@ static void Direct3D11DestroyResources(vout_display_t *vd)
 
     ReleasePictureSys(&sys->stagingSys);
 
+    if (sys->pVertexLayout)
+    {
+        ID3D11InputLayout_Release(sys->pVertexLayout);
+        sys->pVertexLayout = NULL;
+    }
     if (sys->flatVSShader)
     {
         ID3D11VertexShader_Release(sys->flatVSShader);
@@ -1808,7 +1810,7 @@ static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_co
 
             d3dquad->formatInfo = sys->d3dregion_format;
             err = D3D11_SetupQuad( vd, &sys->d3d_dev, &r->fmt, d3dquad, &sys->display, &output,
-                             sys->flatVSShader, PROJECTION_MODE_RECTANGULAR, ORIENT_NORMAL );
+                             sys->flatVSShader, sys->pVertexLayout, PROJECTION_MODE_RECTANGULAR, ORIENT_NORMAL );
             if (err != VLC_SUCCESS) {
                 msg_Err(vd, "Failed to create %dx%d quad for OSD",
                         r->fmt.i_visible_width, r->fmt.i_visible_height);



More information about the vlc-commits mailing list