vlc | branch: master | Steve Lhomme <[email protected]> | Tue Nov 22 11:59:39 2016 +0100| [6734ad934b838eff29bbe07abe8836debf5c9c76] | committer: Jean-Baptiste Kempf
direct3d11: split the code to create the vertex/index buffers for each quad Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6734ad934b838eff29bbe07abe8836debf5c9c76 --- modules/video_output/win32/direct3d11.c | 183 +++++++++++++++++--------------- 1 file changed, 100 insertions(+), 83 deletions(-) diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c index 8be818c..1d912c5 100644 --- a/modules/video_output/win32/direct3d11.c +++ b/modules/video_output/win32/direct3d11.c @@ -1700,12 +1700,56 @@ static void Direct3D11DestroyPool(vout_display_t *vd) sys->pool = NULL; } -static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t *quad, - d3d_quad_cfg_t *cfg, ID3D11PixelShader *d3dpixelShader, bool b_visible) +static void SetupQuadFlat(d3d_vertex_t *dst_data, WORD *triangle_pos) +{ + float right = 1.0f; + float left = -1.0f; + float top = 1.0f; + float bottom = -1.0f; + + // bottom left + dst_data[0].position.x = left; + dst_data[0].position.y = bottom; + dst_data[0].position.z = 0.0f; + dst_data[0].texture.x = 0.0f; + dst_data[0].texture.y = 1.0f; + + // bottom right + dst_data[1].position.x = right; + dst_data[1].position.y = bottom; + dst_data[1].position.z = 0.0f; + dst_data[1].texture.x = 1.0f; + dst_data[1].texture.y = 1.0f; + + // top right + dst_data[2].position.x = right; + dst_data[2].position.y = top; + dst_data[2].position.z = 0.0f; + dst_data[2].texture.x = 1.0f; + dst_data[2].texture.y = 0.0f; + + // top left + dst_data[3].position.x = left; + dst_data[3].position.y = top; + dst_data[3].position.z = 0.0f; + dst_data[3].texture.x = 0.0f; + dst_data[3].texture.y = 0.0f; + + triangle_pos[0] = 3; + triangle_pos[1] = 1; + triangle_pos[2] = 0; + + triangle_pos[3] = 2; + triangle_pos[4] = 1; + triangle_pos[5] = 3; +} + +static bool AllocQuadVertices(vout_display_t *vd, d3d_quad_t *quad) { - vout_display_sys_t *sys = vd->sys; - D3D11_MAPPED_SUBRESOURCE mappedResource; HRESULT hr; + D3D11_MAPPED_SUBRESOURCE mappedResource; + vout_display_sys_t *sys = vd->sys; + quad->vertexCount = 4; quad->indexCount = 2 * 3; @@ -1719,8 +1763,54 @@ static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t * hr = ID3D11Device_CreateBuffer(sys->d3ddevice, &bd, NULL, &quad->pVertexBuffer); if(FAILED(hr)) { msg_Err(vd, "Failed to create vertex buffer. (hr=%lX)", hr); - goto error; + return false; + } + + /* 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); + return false; + } + + /* create the vertices */ + hr = ID3D11DeviceContext_Map(sys->d3dcontext, (ID3D11Resource *)quad->pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(hr)) { + msg_Err(vd, "Failed to lock the vertex buffer (hr=0x%lX)", hr); + return false; + } + d3d_vertex_t *dst_data = mappedResource.pData; + + /* create the vertex indices */ + hr = ID3D11DeviceContext_Map(sys->d3dcontext, (ID3D11Resource *)quad->pIndexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(hr)) { + msg_Err(vd, "Failed to lock the index buffer (hr=0x%lX)", hr); + ID3D11DeviceContext_Unmap(sys->d3dcontext, (ID3D11Resource *)quad->pVertexBuffer, 0); + return false; } + WORD *triangle_pos = mappedResource.pData; + + SetupQuadFlat(dst_data, triangle_pos); + + ID3D11DeviceContext_Unmap(sys->d3dcontext, (ID3D11Resource *)quad->pIndexBuffer, 0); + ID3D11DeviceContext_Unmap(sys->d3dcontext, (ID3D11Resource *)quad->pVertexBuffer, 0); + + return true; +} + +static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t *quad, + d3d_quad_cfg_t *cfg, ID3D11PixelShader *d3dpixelShader, bool b_visible) +{ + vout_display_sys_t *sys = vd->sys; + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr; /* pixel shader constant buffer */ PS_CONSTANT_BUFFER defaultConstants = { @@ -1740,22 +1830,6 @@ 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, - }; - - quad->d3dvertexShader = sys->flatVSShader; - - 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; @@ -1804,6 +1878,7 @@ static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t * goto error; } + /* map texture planes to resource views */ D3D11_SHADER_RESOURCE_VIEW_DESC resviewDesc; memset(&resviewDesc, 0, sizeof(resviewDesc)); resviewDesc.Format = cfg->resourceFormatYRGB; @@ -1828,70 +1903,12 @@ static int AllocQuad(vout_display_t *vd, const video_format_t *fmt, d3d_quad_t * if ( d3dpixelShader != NULL ) { + if ( !AllocQuadVertices( vd, quad ) ) + goto error; + quad->d3dvertexShader = sys->flatVSShader; + quad->d3dpixelShader = d3dpixelShader; ID3D11PixelShader_AddRef(quad->d3dpixelShader); - - float right = 1.0f; - float left = -1.0f; - float top = 1.0f; - float bottom = -1.0f; - - hr = ID3D11DeviceContext_Map(sys->d3dcontext, (ID3D11Resource *)quad->pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (SUCCEEDED(hr)) { - d3d_vertex_t *dst_data = mappedResource.pData; - - // bottom left - dst_data[0].position.x = left; - dst_data[0].position.y = bottom; - dst_data[0].position.z = 0.0f; - dst_data[0].texture.x = 0.0f; - dst_data[0].texture.y = 1.0f; - - // bottom right - dst_data[1].position.x = right; - dst_data[1].position.y = bottom; - dst_data[1].position.z = 0.0f; - dst_data[1].texture.x = 1.0f; - dst_data[1].texture.y = 1.0f; - - // top right - dst_data[2].position.x = right; - dst_data[2].position.y = top; - dst_data[2].position.z = 0.0f; - dst_data[2].texture.x = 1.0f; - dst_data[2].texture.y = 0.0f; - - // top left - dst_data[3].position.x = left; - dst_data[3].position.y = top; - dst_data[3].position.z = 0.0f; - dst_data[3].texture.x = 0.0f; - dst_data[3].texture.y = 0.0f; - - ID3D11DeviceContext_Unmap(sys->d3dcontext, (ID3D11Resource *)quad->pVertexBuffer, 0); - } - 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; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
