vlc | branch: master | Steve Lhomme <[email protected]> | Mon Nov 21 10:03:02 2016 +0100| [95f195dbbd6dc1b6345db4f901778b36dcdf4615] | committer: Jean-Baptiste Kempf
direct3d11: use a different vertex shader per quad The SPU need the flat vertex shader but others may need different shaders. Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=95f195dbbd6dc1b6345db4f901778b36dcdf4615 --- 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); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
