vlc | branch: master | Steve Lhomme <[email protected]> | Tue Feb 9 08:01:25 2021 +0100| [8d29562f724990fb55020b66969af4232840911c] | committer: Steve Lhomme
d3d_shaders: merge the 2 constant buffers into one In D3D12 the proper alignment is 256 bytes so we just use that. Uploading 25 bytes instead of 8/200 will not have a significant impact. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8d29562f724990fb55020b66969af4232840911c --- modules/video_output/win32/d3d11_quad.c | 33 ++++++------------------------ modules/video_output/win32/d3d11_quad.h | 3 +-- modules/video_output/win32/d3d11_shaders.h | 3 +-- modules/video_output/win32/d3d_shaders.c | 27 +++++++++++------------- modules/video_output/win32/d3d_shaders.h | 13 ++++-------- 5 files changed, 24 insertions(+), 55 deletions(-) diff --git a/modules/video_output/win32/d3d11_quad.c b/modules/video_output/win32/d3d11_quad.c index 40cc1af11d..8633290c60 100644 --- a/modules/video_output/win32/d3d11_quad.c +++ b/modules/video_output/win32/d3d11_quad.c @@ -60,7 +60,7 @@ void D3D11_RenderQuad(d3d11_device_t *d3d_dev, d3d11_quad_t *quad, d3d11_vertex_ ID3D11DeviceContext_PSSetSamplers(d3d_dev->d3dcontext, 0, 2, quad->SamplerStates); /* pixel shader */ - ID3D11DeviceContext_PSSetConstantBuffers(d3d_dev->d3dcontext, 0, ARRAY_SIZE(quad->pPixelShaderConstants), quad->pPixelShaderConstants); + ID3D11DeviceContext_PSSetConstantBuffers(d3d_dev->d3dcontext, 0, 1, &quad->pPixelShaderConstants); assert(quad->resourceCount <= DXGI_MAX_SHADER_VIEW); ID3D11DeviceContext_PSSetShaderResources(d3d_dev->d3dcontext, 0, quad->resourceCount, resourceView); @@ -137,15 +137,10 @@ fail: void D3D11_ReleaseQuad(d3d11_quad_t *quad) { - if (quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]) + if (quad->pPixelShaderConstants) { - ID3D11Buffer_Release(quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]); - quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS] = NULL; - } - if (quad->pPixelShaderConstants[PS_CONST_COLORSPACE]) - { - ID3D11Buffer_Release(quad->pPixelShaderConstants[PS_CONST_COLORSPACE]); - quad->pPixelShaderConstants[PS_CONST_COLORSPACE] = NULL; + ID3D11Buffer_Release(quad->pPixelShaderConstants); + quad->pPixelShaderConstants = NULL; } if (quad->pVertexBuffer) { @@ -216,10 +211,7 @@ static bool ShaderUpdateConstants(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d1 switch (type) { case PS_CONST_LUMI_BOUNDS: - res = (ID3D11Resource *)quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]; - break; - case PS_CONST_COLORSPACE: - res = (ID3D11Resource *)quad->pPixelShaderConstants[PS_CONST_COLORSPACE]; + res = (ID3D11Resource *)quad->pPixelShaderConstants; break; case VS_CONST_VIEWPOINT: res = (ID3D11Resource *)quad->viewpointShaderConstant; @@ -239,9 +231,6 @@ static bool ShaderUpdateConstants(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d1 case PS_CONST_LUMI_BOUNDS: memcpy(mappedResource.pData, new_buf, sizeof(PS_CONSTANT_BUFFER)); break; - case PS_CONST_COLORSPACE: - memcpy(mappedResource.pData, new_buf, sizeof(PS_COLOR_TRANSFORM)); - break; case VS_CONST_VIEWPOINT: memcpy(mappedResource.pData, new_buf, sizeof(VS_PROJECTION_CONST)); break; @@ -286,7 +275,6 @@ int D3D11_AllocateQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, video_projection_mode_t projection, d3d11_quad_t *quad) { quad->generic.vertexConstants = &quad->vConstants; - quad->generic.colorsConstants = &quad->cConstants; quad->generic.shaderConstants = &quad->pConstants; HRESULT hr; @@ -297,20 +285,12 @@ int D3D11_AllocateQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, .BindFlags = D3D11_BIND_CONSTANT_BUFFER, .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE, }; - hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, NULL, &quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]); + hr = ID3D11Device_CreateBuffer(d3d_dev->d3ddevice, &constantDesc, NULL, &quad->pPixelShaderConstants); 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"); @@ -339,7 +319,6 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format D3D_SetupQuad(o, fmt, &quad->generic, displayFormat); ShaderUpdateConstants(o, d3d_dev, quad, PS_CONST_LUMI_BOUNDS, quad->generic.shaderConstants); - ShaderUpdateConstants(o, d3d_dev, quad, PS_CONST_COLORSPACE, quad->generic.colorsConstants); for (size_t i=0; i<ARRAY_SIZE(quad->cropViewport); i++) { diff --git a/modules/video_output/win32/d3d11_quad.h b/modules/video_output/win32/d3d11_quad.h index b25ded57ad..01ffca82fd 100644 --- a/modules/video_output/win32/d3d11_quad.h +++ b/modules/video_output/win32/d3d11_quad.h @@ -27,8 +27,7 @@ #include "d3d11_shaders.h" #define PS_CONST_LUMI_BOUNDS 0 -#define PS_CONST_COLORSPACE 1 -#define VS_CONST_VIEWPOINT 2 +#define VS_CONST_VIEWPOINT 1 typedef bool (*d3d11_select_plane_t)(void *opaque, size_t plane_index); diff --git a/modules/video_output/win32/d3d11_shaders.h b/modules/video_output/win32/d3d11_shaders.h index f076d949aa..e0a716a2a6 100644 --- a/modules/video_output/win32/d3d11_shaders.h +++ b/modules/video_output/win32/d3d11_shaders.h @@ -42,14 +42,13 @@ typedef struct ID3D11Buffer *pVertexBuffer; ID3D11Buffer *pIndexBuffer; ID3D11Buffer *viewpointShaderConstant; - ID3D11Buffer *pPixelShaderConstants[2]; + ID3D11Buffer *pPixelShaderConstants; UINT PSConstantsCount; ID3D11PixelShader *d3dpixelShader[DXGI_MAX_RENDER_TARGET]; ID3D11SamplerState *SamplerStates[2]; D3D11_VIEWPORT cropViewport[DXGI_MAX_RENDER_TARGET]; PS_CONSTANT_BUFFER pConstants; - PS_COLOR_TRANSFORM cConstants; VS_PROJECTION_CONST vConstants; } d3d11_quad_t; diff --git a/modules/video_output/win32/d3d_shaders.c b/modules/video_output/win32/d3d_shaders.c index be4674a1e5..0830528d9b 100644 --- a/modules/video_output/win32/d3d_shaders.c +++ b/modules/video_output/win32/d3d_shaders.c @@ -51,17 +51,14 @@ const float ST2084_c3 = (2392.0 / 4096.0) * 32.0;\n" static const char* globPixelShaderDefault = "\ cbuffer PS_CONSTANT_BUFFER : register(b0)\n\ {\n\ + float4x4 WhitePoint;\n\ + float4x4 Colorspace;\n\ + float4x4 Primaries;\n\ float Opacity;\n\ float LuminanceScale;\n\ float BoundaryX;\n\ float BoundaryY;\n\ };\n\ - cbuffer PS_COLOR_TRANSFORM : register(b1)\n\ - {\n\ - float4x4 WhitePoint;\n\ - float4x4 Colorspace;\n\ - float4x4 Primaries;\n\ - };\n\ Texture2D%s shaderTexture[4];\n\ SamplerState normalSampler : register(s0);\n\ SamplerState borderSampler : register(s1);\n\ @@ -1057,7 +1054,7 @@ void D3D_SetupQuad(vlc_object_t *o, const video_format_t *fmt, d3d_quad_t *quad, 0.f, 0.f, 0.f, 1.f, }; - memcpy(quad->colorsConstants->WhitePoint, IDENTITY_4X4, sizeof(quad->colorsConstants->WhitePoint)); + memcpy(quad->shaderConstants->WhitePoint, IDENTITY_4X4, sizeof(quad->shaderConstants->WhitePoint)); const FLOAT *ppColorspace; if (RGB_src_shader == DxgiIsRGBFormat(displayFormat->pixelFormat)) @@ -1067,9 +1064,9 @@ void D3D_SetupQuad(vlc_object_t *o, const video_format_t *fmt, d3d_quad_t *quad, else if (RGB_src_shader) { ppColorspace = COLORSPACE_FULL_RGBA_TO_BT601_YUV; - quad->colorsConstants->WhitePoint[0*4 + 3] = -itu_black_level; - quad->colorsConstants->WhitePoint[1*4 + 3] = itu_achromacy; - quad->colorsConstants->WhitePoint[2*4 + 3] = itu_achromacy; + quad->shaderConstants->WhitePoint[0*4 + 3] = -itu_black_level; + quad->shaderConstants->WhitePoint[1*4 + 3] = itu_achromacy; + quad->shaderConstants->WhitePoint[2*4 + 3] = itu_achromacy; } else { @@ -1096,16 +1093,16 @@ void D3D_SetupQuad(vlc_object_t *o, const video_format_t *fmt, d3d_quad_t *quad, break; } /* all matrices work in studio range and output in full range */ - quad->colorsConstants->WhitePoint[0*4 + 3] = -itu_black_level; - quad->colorsConstants->WhitePoint[1*4 + 3] = -itu_achromacy; - quad->colorsConstants->WhitePoint[2*4 + 3] = -itu_achromacy; + quad->shaderConstants->WhitePoint[0*4 + 3] = -itu_black_level; + quad->shaderConstants->WhitePoint[1*4 + 3] = -itu_achromacy; + quad->shaderConstants->WhitePoint[2*4 + 3] = -itu_achromacy; } - memcpy(quad->colorsConstants->Colorspace, ppColorspace, sizeof(quad->colorsConstants->Colorspace)); + memcpy(quad->shaderConstants->Colorspace, ppColorspace, sizeof(quad->shaderConstants->Colorspace)); if (fmt->primaries != displayFormat->primaries) { - GetPrimariesTransform(quad->colorsConstants->Primaries, fmt->primaries, + GetPrimariesTransform(quad->shaderConstants->Primaries, fmt->primaries, displayFormat->primaries); } } diff --git a/modules/video_output/win32/d3d_shaders.h b/modules/video_output/win32/d3d_shaders.h index 99cf19704c..c660476346 100644 --- a/modules/video_output/win32/d3d_shaders.h +++ b/modules/video_output/win32/d3d_shaders.h @@ -45,20 +45,16 @@ typedef struct { /* structures passed to the pixel shader */ typedef struct { + FLOAT WhitePoint[4*4]; + FLOAT Colorspace[4*4]; + FLOAT Primaries[4*4]; FLOAT Opacity; FLOAT LuminanceScale; FLOAT BoundaryX; FLOAT BoundaryY; - FLOAT padding[60]; // 256 bytes alignment + FLOAT padding[12]; // 256 bytes alignment } PS_CONSTANT_BUFFER; -typedef struct { - FLOAT WhitePoint[4*4]; - FLOAT Colorspace[4*4]; - FLOAT Primaries[4*4]; - FLOAT padding[16]; // 256 bytes alignment -} PS_COLOR_TRANSFORM; - typedef struct { FLOAT View[4*4]; FLOAT Zoom[4*4]; @@ -100,7 +96,6 @@ typedef struct unsigned int i_height; PS_CONSTANT_BUFFER *shaderConstants; - PS_COLOR_TRANSFORM *colorsConstants; VS_PROJECTION_CONST *vertexConstants; } d3d_quad_t; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
