[vlc-devel] [PATCH 3/3] direct3d11: don't set the number of index in stone

Steve Lhomme robux4 at videolabs.io
Tue Nov 15 17:30:31 CET 2016


---
 modules/video_output/win32/common.h     |  2 +
 modules/video_output/win32/direct3d11.c | 68 ++++++++++++++++++++-------------
 2 files changed, 43 insertions(+), 27 deletions(-)

diff --git a/modules/video_output/win32/common.h b/modules/video_output/win32/common.h
index d64668e..5190fab 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;
+    ID3D11Buffer              *pIndexBuffer;
+    UINT                      indexCount;
     ID3D11Texture2D           *pTexture;
     ID3D11ShaderResourceView  *d3dresViewY;
     ID3D11ShaderResourceView  *d3dresViewUV;
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index b42b00e..ad9e80c 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -912,7 +912,8 @@ static void DisplayD3DPicture(vout_display_sys_t *sys, d3d_quad_t *quad)
         ID3D11DeviceContext_PSSetShaderResources(sys->d3dcontext, 1, 1, &quad->d3dresViewUV);
 
     ID3D11DeviceContext_IASetVertexBuffers(sys->d3dcontext, 0, 1, &quad->pVertexBuffer, &stride, &offset);
-    ID3D11DeviceContext_DrawIndexed(sys->d3dcontext, 6, 0, 0);
+    ID3D11DeviceContext_IASetIndexBuffer(sys->d3dcontext, quad->pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
+    ID3D11DeviceContext_DrawIndexed(sys->d3dcontext, quad->indexCount, 0, 0);
 }
 
 static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
@@ -1511,32 +1512,6 @@ static int Direct3D11CreateResources(vout_display_t *vd, video_format_t *fmt)
     ID3D11DeviceContext_IASetInputLayout(sys->d3dcontext, pVertexLayout);
     ID3D11SamplerState_Release(pVertexLayout);
 
-    /* create the index of the vertices */
-    WORD indices[] = {
-      3, 1, 0,
-      2, 1, 3,
-    };
-
-    D3D11_BUFFER_DESC quadDesc = {
-        .Usage = D3D11_USAGE_DEFAULT,
-        .ByteWidth = sizeof(WORD) * 6,
-        .BindFlags = D3D11_BIND_INDEX_BUFFER,
-        .CPUAccessFlags = 0,
-    };
-
-    D3D11_SUBRESOURCE_DATA quadIndicesInit = {
-        .pSysMem = indices,
-    };
-
-    ID3D11Buffer* pIndexBuffer = NULL;
-    hr = ID3D11Device_CreateBuffer(sys->d3ddevice, &quadDesc, &quadIndicesInit, &pIndexBuffer);
-    if(FAILED(hr)) {
-        msg_Err(vd, "Could not Create the common quad indices. (hr=0x%lX)", hr);
-        return VLC_EGENERIC;
-    }
-    ID3D11DeviceContext_IASetIndexBuffer(sys->d3dcontext, pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
-    ID3D11Buffer_Release(pIndexBuffer);
-
     ID3D11DeviceContext_IASetPrimitiveTopology(sys->d3dcontext, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
 
     ID3DBlob* pPSBlob = NULL;
@@ -1689,6 +1664,7 @@ static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t *
     D3D11_MAPPED_SUBRESOURCE mappedResource;
     HRESULT hr;
     quad->vertexCount = 4;
+    quad->indexCount = 2 * 3;
 
     D3D11_BUFFER_DESC bd;
     memset(&bd, 0, sizeof(bd));
@@ -1703,6 +1679,20 @@ static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t *
       goto error;
     }
 
+    /* create the index of the vertices */
+    D3D11_BUFFER_DESC quadDesc = {
+        .Usage = D3D11_USAGE_DYNAMIC,
+        .ByteWidth = sizeof(WORD) * quad->indexCount,
+        .BindFlags = D3D11_BIND_INDEX_BUFFER,
+        .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE,
+    };
+
+    hr = ID3D11Device_CreateBuffer(sys->d3ddevice, &quadDesc, NULL, &quad->pIndexBuffer);
+    if(FAILED(hr)) {
+        msg_Err(vd, "Could not create the quad indices. (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;
@@ -1824,6 +1814,25 @@ static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t *
         else {
             msg_Err(vd, "Failed to lock the subpicture vertex buffer (hr=0x%lX)", hr);
         }
+
+        /* create the vertex indices */
+        hr = ID3D11DeviceContext_Map(sys->d3dcontext, (ID3D11Resource *)quad->pIndexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+        if (SUCCEEDED(hr)) {
+            WORD *dst_data = mappedResource.pData;
+
+            dst_data[0] = 3;
+            dst_data[1] = 1;
+            dst_data[2] = 0;
+
+            dst_data[3] = 2;
+            dst_data[4] = 1;
+            dst_data[5] = 3;
+
+            ID3D11DeviceContext_Unmap(sys->d3dcontext, (ID3D11Resource *)quad->pIndexBuffer, 0);
+        }
+        else {
+            msg_Err(vd, "Failed to lock the index buffer (hr=0x%lX)", hr);
+        }
     }
 
     return VLC_SUCCESS;
@@ -1840,6 +1849,11 @@ static void ReleaseQuad(d3d_quad_t *quad)
         ID3D11Buffer_Release(quad->pVertexBuffer);
         quad->pVertexBuffer = NULL;
     }
+    if (quad->pIndexBuffer)
+    {
+        ID3D11Buffer_Release(quad->pIndexBuffer);
+        quad->pIndexBuffer = NULL;
+    }
     if (quad->pTexture)
     {
         ID3D11Texture2D_Release(quad->pTexture);
-- 
2.10.1



More information about the vlc-devel mailing list