vlc | branch: master | Steve Lhomme <[email protected]> | Mon Apr 30 13:59:24 2018 +0200| [29daa013a1e108780fff445b2050c4ccbcfa8683] | committer: Steve Lhomme
d3d11_quad: split D3D11_SetupQuad() into allocate and setup > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=29daa013a1e108780fff445b2050c4ccbcfa8683 --- modules/video_output/win32/d3d11_quad.c | 134 +++++++++++++++++--------------- modules/video_output/win32/d3d11_quad.h | 10 ++- 2 files changed, 81 insertions(+), 63 deletions(-) diff --git a/modules/video_output/win32/d3d11_quad.c b/modules/video_output/win32/d3d11_quad.c index 1e308290e1..b1bea62485 100644 --- a/modules/video_output/win32/d3d11_quad.c +++ b/modules/video_output/win32/d3d11_quad.c @@ -63,7 +63,7 @@ void D3D11_RenderQuad(d3d11_device_t *d3d_dev, d3d_quad_t *quad, ID3D11DeviceContext_PSSetSamplers(d3d_dev->d3dcontext, 0, 2, quad->d3dsampState); /* pixel shader */ - ID3D11DeviceContext_PSSetConstantBuffers(d3d_dev->d3dcontext, 0, quad->PSConstantsCount, quad->pPixelShaderConstants); + ID3D11DeviceContext_PSSetConstantBuffers(d3d_dev->d3dcontext, 0, ARRAY_SIZE(quad->pPixelShaderConstants), quad->pPixelShaderConstants); assert(quad->resourceCount <= D3D11_MAX_SHADER_VIEW); ID3D11DeviceContext_PSSetShaderResources(d3d_dev->d3dcontext, 0, quad->resourceCount, resourceView); @@ -82,11 +82,11 @@ void D3D11_RenderQuad(d3d11_device_t *d3d_dev, d3d_quad_t *quad, } } -static bool AllocQuadVertices(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_t *quad) +static bool AllocQuadVertices(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_t *quad, video_projection_mode_t projection) { HRESULT hr; - switch (quad->projection) + switch (projection) { case PROJECTION_MODE_RECTANGULAR: quad->vertexCount = 4; @@ -101,7 +101,7 @@ static bool AllocQuadVertices(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad quad->indexCount = 6 * 2 * 3; break; default: - msg_Warn(o, "Projection mode %d not handled", quad->projection); + msg_Warn(o, "Projection mode %d not handled", projection); return false; } @@ -141,15 +141,15 @@ static bool AllocQuadVertices(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad void D3D11_ReleaseQuad(d3d_quad_t *quad) { - if (quad->pPixelShaderConstants[0]) + if (quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]) { - ID3D11Buffer_Release(quad->pPixelShaderConstants[0]); - quad->pPixelShaderConstants[0] = NULL; + ID3D11Buffer_Release(quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]); + quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS] = NULL; } - if (quad->pPixelShaderConstants[1]) + if (quad->pPixelShaderConstants[PS_CONST_COLORSPACE]) { - ID3D11Buffer_Release(quad->pPixelShaderConstants[1]); - quad->pPixelShaderConstants[1] = NULL; + ID3D11Buffer_Release(quad->pPixelShaderConstants[PS_CONST_COLORSPACE]); + quad->pPixelShaderConstants[PS_CONST_COLORSPACE] = NULL; } if (quad->pVertexBuffer) { @@ -596,19 +596,21 @@ bool D3D11_UpdateQuadPosition( vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_qua return true; } -static bool ShaderUpdateConstants(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_t *quad) +static bool ShaderUpdateConstants(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_t *quad, size_t index, void *new_buf) { D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT hr = ID3D11DeviceContext_Map(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pPixelShaderConstants[0], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + HRESULT hr = ID3D11DeviceContext_Map(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pPixelShaderConstants[index], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); if (FAILED(hr)) { msg_Err(o, "Failed to lock the picture shader constants (hr=0x%lX)", hr); return false; } - PS_CONSTANT_BUFFER *dst_data = mappedResource.pData; - *dst_data = quad->shaderConstants; - ID3D11DeviceContext_Unmap(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pPixelShaderConstants[0], 0); + if (index == PS_CONST_LUMI_BOUNDS) + memcpy(mappedResource.pData, new_buf,sizeof(PS_CONSTANT_BUFFER)); + else + memcpy(mappedResource.pData, new_buf,sizeof(PS_COLOR_TRANSFORM)); + ID3D11DeviceContext_Unmap(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pPixelShaderConstants[index], 0); return true; } @@ -620,7 +622,7 @@ void D3D11_UpdateQuadOpacity(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_ float old = quad->shaderConstants.Opacity; quad->shaderConstants.Opacity = opacity; - if (!ShaderUpdateConstants(o, d3d_dev, quad)) + if (!ShaderUpdateConstants(o, d3d_dev, quad, PS_CONST_LUMI_BOUNDS, &quad->shaderConstants)) quad->shaderConstants.Opacity = old; } @@ -632,17 +634,67 @@ void D3D11_UpdateQuadLuminanceScale(vlc_object_t *o, d3d11_device_t *d3d_dev, d3 float old = quad->shaderConstants.LuminanceScale; quad->shaderConstants.LuminanceScale = luminanceScale; - if (!ShaderUpdateConstants(o, d3d_dev, quad)) + if (!ShaderUpdateConstants(o, d3d_dev, quad, PS_CONST_LUMI_BOUNDS, &quad->shaderConstants)) quad->shaderConstants.LuminanceScale = old; } +#undef D3D11_AllocateQuad +int D3D11_AllocateQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, + video_projection_mode_t projection, d3d_quad_t *quad) +{ + HRESULT hr; + static_assert((sizeof(PS_CONSTANT_BUFFER)%16)==0,"Constant buffers require 16-byte alignment"); + D3D11_BUFFER_DESC constantDesc = { + .Usage = D3D11_USAGE_DYNAMIC, + .ByteWidth = sizeof(PS_CONSTANT_BUFFER), + .BindFlags = D3D11_BIND_CONSTANT_BUFFER, + .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE, + }; + hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, NULL, &quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]); + if(FAILED(hr)) { + msg_Err(o, "Could not create the pixel shader constant buffer. (hr=0x%lX)", hr); + goto error; + } + + static_assert((sizeof(PS_COLOR_TRANSFORM)%16)==0,"Constant buffers require 16-byte alignment"); + constantDesc.ByteWidth = sizeof(PS_COLOR_TRANSFORM); + hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, NULL, &quad->pPixelShaderConstants[PS_CONST_COLORSPACE]); + if(FAILED(hr)) { + msg_Err(o, "Could not create the pixel shader colorspace buffer. (hr=0x%lX)", hr); + goto error; + } + + if (projection == PROJECTION_MODE_EQUIRECTANGULAR || projection == PROJECTION_MODE_CUBEMAP_LAYOUT_STANDARD) + { + static_assert((sizeof(VS_PROJECTION_CONST)%16)==0,"Constant buffers require 16-byte alignment"); + constantDesc.ByteWidth = sizeof(VS_PROJECTION_CONST); + hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, NULL, &quad->pVertexShaderConstants); + if(FAILED(hr)) { + msg_Err(o, "Could not create the vertex shader constant buffer. (hr=0x%lX)", hr); + goto error; + } + } + + if (!AllocQuadVertices(o, d3d_dev, quad, projection)) + goto error; + quad->projection = projection; + + return VLC_SUCCESS; + +error: + D3D11_ReleaseQuad(quad); + return VLC_EGENERIC; +} + #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, ID3D11InputLayout *pVertexLayout, video_projection_mode_t projection, video_orientation_t orientation) { - HRESULT hr; + if (D3D11_AllocateQuad(o, d3d_dev, projection, quad) != VLC_SUCCESS) + return VLC_EGENERIC; + const bool RGB_shader = IsRGBShader(quad->formatInfo); quad->shaderConstants.LuminanceScale = GetFormatLuminance(o, fmt) / (float)displayFormat->luminance_peak; @@ -658,19 +710,7 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format else quad->shaderConstants.BoundaryY = (FLOAT) (fmt->i_visible_height - 1) / fmt->i_height; - static_assert((sizeof(PS_CONSTANT_BUFFER)%16)==0,"Constant buffers require 16-byte alignment"); - D3D11_BUFFER_DESC constantDesc = { - .Usage = D3D11_USAGE_DYNAMIC, - .ByteWidth = sizeof(PS_CONSTANT_BUFFER), - .BindFlags = D3D11_BIND_CONSTANT_BUFFER, - .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE, - }; - D3D11_SUBRESOURCE_DATA constantInit = { .pSysMem = &quad->shaderConstants }; - hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, &constantInit, &quad->pPixelShaderConstants[0]); - if(FAILED(hr)) { - msg_Err(o, "Could not create the pixel shader constant buffer. (hr=0x%lX)", hr); - goto error; - } + ShaderUpdateConstants(o, d3d_dev, quad, PS_CONST_LUMI_BOUNDS, &quad->shaderConstants); FLOAT itu_black_level = 0.f; FLOAT itu_achromacy = 0.f; @@ -788,39 +828,15 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format memcpy(colorspace.Colorspace, ppColorspace, sizeof(colorspace.Colorspace)); - constantInit.pSysMem = &colorspace; + ShaderUpdateConstants(o, d3d_dev, quad, PS_CONST_COLORSPACE, &colorspace); - static_assert((sizeof(PS_COLOR_TRANSFORM)%16)==0,"Constant buffers require 16-byte alignment"); - constantDesc.ByteWidth = sizeof(PS_COLOR_TRANSFORM); - hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, &constantInit, &quad->pPixelShaderConstants[1]); - if(FAILED(hr)) { - msg_Err(o, "Could not create the pixel shader constant buffer. (hr=0x%lX)", hr); - goto error; - } - quad->PSConstantsCount = 2; - quad->projection = projection; - - /* vertex shader constant buffer */ - if (projection == PROJECTION_MODE_EQUIRECTANGULAR - || projection == PROJECTION_MODE_CUBEMAP_LAYOUT_STANDARD) - { - constantDesc.ByteWidth = sizeof(VS_PROJECTION_CONST); - static_assert((sizeof(VS_PROJECTION_CONST)%16)==0,"Constant buffers require 16-byte alignment"); - hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, NULL, &quad->pVertexShaderConstants); - if(FAILED(hr)) { - msg_Err(o, "Could not create the vertex shader constant buffer. (hr=0x%lX)", hr); - goto error; - } - } quad->picSys.formatTexture = quad->formatInfo->formatTexture; quad->picSys.context = d3d_dev->d3dcontext; ID3D11DeviceContext_AddRef(quad->picSys.context); - if (!AllocQuadVertices(o, d3d_dev, quad)) - goto error; if (!D3D11_UpdateQuadPosition(o, d3d_dev, quad, output, orientation)) - goto error; + return VLC_EGENERIC; for (size_t i=0; i<D3D11_MAX_SHADER_VIEW; i++) { @@ -832,10 +848,6 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format quad->resourceCount = DxgiResourceCount(quad->formatInfo); return VLC_SUCCESS; - -error: - D3D11_ReleaseQuad(quad); - return VLC_EGENERIC; } void D3D11_UpdateViewport(d3d_quad_t *quad, const RECT *rect, const d3d_format_t *display) diff --git a/modules/video_output/win32/d3d11_quad.h b/modules/video_output/win32/d3d11_quad.h index 0204b44c20..97d60152e9 100644 --- a/modules/video_output/win32/d3d11_quad.h +++ b/modules/video_output/win32/d3d11_quad.h @@ -28,6 +28,10 @@ #define SPHERE_RADIUS 1.f +#define PS_CONST_LUMI_BOUNDS 0 +#define PS_CONST_COLORSPACE 1 +#define PS_CONST_COUNT 2 + /* A Quad is texture that can be displayed in a rectangle */ typedef struct { @@ -41,8 +45,7 @@ typedef struct ID3D11Buffer *pIndexBuffer; UINT indexCount; ID3D11Buffer *pVertexShaderConstants; - ID3D11Buffer *pPixelShaderConstants[2]; - UINT PSConstantsCount; + ID3D11Buffer *pPixelShaderConstants[PS_CONST_COUNT]; ID3D11PixelShader *d3dpixelShader[D3D11_MAX_SHADER_VIEW]; ID3D11SamplerState *d3dsampState[2]; ID3D11InputLayout *pVertexLayout; @@ -71,6 +74,9 @@ void D3D11_RenderQuad(d3d11_device_t *, d3d_quad_t *, ID3D11ShaderResourceView *resourceViews[D3D11_MAX_SHADER_VIEW], ID3D11RenderTargetView *renderTarget[D3D11_MAX_SHADER_VIEW]); +int D3D11_AllocateQuad(vlc_object_t *, d3d11_device_t *, video_projection_mode_t, d3d_quad_t *); +#define D3D11_AllocateQuad(a,b,c,d) D3D11_AllocateQuad(VLC_OBJECT(a),b,c,d) + void D3D11_ReleaseQuad(d3d_quad_t *); int D3D11_SetupQuad(vlc_object_t *, d3d11_device_t *, const video_format_t *, d3d_quad_t *, _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
