[guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limite...
authorAnton Fedchin <afedchin@ruswizards.com>
Thu, 20 Aug 2015 14:35:05 +0000 (17:35 +0300)
committerAnton Fedchin <afedchin@ruswizards.com>
Fri, 28 Aug 2015 08:15:06 +0000 (11:15 +0300)
12 files changed:
system/shaders/guishader_checkerboard_left.hlsl
system/shaders/guishader_checkerboard_right.hlsl
system/shaders/guishader_common.hlsl
system/shaders/guishader_default.hlsl
system/shaders/guishader_fonts.hlsl
system/shaders/guishader_interlaced_left.hlsl
system/shaders/guishader_interlaced_right.hlsl
system/shaders/guishader_multi_texture_blend.hlsl
system/shaders/guishader_texture.hlsl
system/shaders/guishader_vert.hlsl
xbmc/guilib/GUIShaderDX.cpp
xbmc/guilib/GUIShaderDX.h

index 3795b72..7639a8c 100644 (file)
@@ -22,7 +22,7 @@
 
 Texture2D texView : register(t0);
 
-cbuffer cbViewPort : register(b0)
+cbuffer cbViewPort : register(b1)
 {
   float g_viewPortX;
   float g_viewPortY;
index 2b0d969..eb02a21 100644 (file)
@@ -22,7 +22,7 @@
 
 Texture2D texView : register(t0);
 
-cbuffer cbViewPort : register(b0)
+cbuffer cbViewPort : register(b1)
 {
   float g_viewPortX;
   float g_viewPortY;
index c912201..0f2a7a7 100644 (file)
@@ -42,6 +42,18 @@ SamplerState LinearSampler : register(s0)
   Comparison = NEVER;
 };
 
+cbuffer cbWorld : register(b0)
+{
+  float4x4 worldViewProj;
+  float blackLevel;
+  float colorRange;
+};
+
+inline float4 adjustColorRange(float4 color)
+{
+  return float4(blackLevel + colorRange * color.rgb, color.a);
+}
+
 #define STEREO_LEFT_EYE_INDEX  0
 #define STEREO_RIGHT_EYE_INDEX 1
 
index bf68e44..cf4183a 100644 (file)
@@ -22,7 +22,7 @@
 
 float4 PS(PS_INPUT input) : SV_TARGET
 {
-  return input.color;
+  return adjustColorRange(input.color);
 }
 
 
index c0acdb7..def887d 100644 (file)
@@ -25,7 +25,7 @@ Texture2D texFont : register(t0);
 float4 PS(PS_INPUT input) : SV_TARGET
 {
   input.color.a *= texFont.Sample(LinearSampler, input.tex).r;
-  return input.color;
+  return adjustColorRange(input.color);
 }
 
 
index fcb6d27..41a7b92 100644 (file)
@@ -22,7 +22,7 @@
 
 Texture2D texView : register(t0);
 
-cbuffer cbViewPort : register(b0)
+cbuffer cbViewPort : register(b1)
 {
   float g_viewPortX;
   float g_viewPortY;
index ac3b8af..394d5b9 100644 (file)
@@ -22,7 +22,7 @@
 
 Texture2D texView : register(t0);
 
-cbuffer cbViewPort : register(b0)
+cbuffer cbViewPort : register(b1)
 {
   float g_viewPortX;
   float g_viewPortY;
index e968ae3..33f1f0f 100644 (file)
@@ -24,8 +24,8 @@ Texture2D txDiffuse[2] : register(t0);
 
 float4 PS(PS_INPUT input) : SV_TARGET
 {
-  return input.color * txDiffuse[0].Sample(LinearSampler, input.tex)
-                     * txDiffuse[1].Sample(LinearSampler, input.tex2);
+  return adjustColorRange(input.color * txDiffuse[0].Sample(LinearSampler, input.tex)
+                          * txDiffuse[1].Sample(LinearSampler, input.tex2));
 }
 
 
index b557e3b..845747e 100644 (file)
@@ -24,7 +24,7 @@ Texture2D texMain : register(t0);
 
 float4 PS(PS_INPUT input) : SV_TARGET
 {
-  return input.color * texMain.Sample(LinearSampler, input.tex);
+  return adjustColorRange(input.color * texMain.Sample(LinearSampler, input.tex));
 }
 
 
index 1799199..508cbb7 100644 (file)
 
 #include "guishader_common.hlsl"
 
-cbuffer cbWorld : register(b0)
-{
-  float4x4 worldViewProj;
-};
-
 PS_INPUT VS(VS_INPUT input)
 {
   PS_INPUT output = (PS_INPUT)0;
index c745ba5..e09942e 100644 (file)
@@ -22,6 +22,8 @@
 #include <d3dcompiler.h>
 #include "GUIShaderDX.h"
 #include "guilib/GraphicContext.h"
+#include "settings/lib/Setting.h"
+#include "settings/Settings.h"
 #include "utils/log.h"
 #include "windowing/WindowingFactory.h"
 
@@ -112,7 +114,7 @@ bool CGUIShaderDX::Initialize()
       m_pixelShader[j].Release();
   }
 
-  if (!CreateBuffers() || !CreateSamplers())
+  if (!bSuccess || !CreateBuffers() || !CreateSamplers())
     return false;
 
   m_bCreated = true;
@@ -132,7 +134,8 @@ bool CGUIShaderDX::CreateBuffers()
   }
 
   // Create the constant buffer for WVP
-  CD3D11_BUFFER_DESC cbbd(sizeof(XMMATRIX), D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); // it can change very frequently
+  size_t buffSize = (sizeof(cbWorld) + 15) & ~15;
+  CD3D11_BUFFER_DESC cbbd(buffSize, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); // it can change very frequently
   if (FAILED(pDevice->CreateBuffer(&cbbd, NULL, &m_pWVPBuffer)))
   {
     CLog::Log(LOGERROR, __FUNCTION__ " - Failed to create the constant buffer.");
@@ -195,7 +198,8 @@ void CGUIShaderDX::ApplyStateBlock(void)
   pContext->VSSetConstantBuffers(0, 1, &m_pWVPBuffer);
 
   m_pixelShader[m_currentShader].BindShader();
-  pContext->PSSetConstantBuffers(0, 1, &m_pVPBuffer);
+  pContext->PSSetConstantBuffers(0, 1, &m_pWVPBuffer);
+  pContext->PSSetConstantBuffers(1, 1, &m_pVPBuffer);
 
   ID3D11SamplerState* samplers[] = { m_pSampLinear, m_pSampPoint };
   pContext->PSSetSamplers(0, ARRAYSIZE(samplers), samplers);
@@ -345,9 +349,13 @@ void CGUIShaderDX::ApplyChanges(void)
     if (SUCCEEDED(pContext->Map(m_pWVPBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res)))
     {
       XMMATRIX worldView = XMMatrixMultiply(m_cbWorldViewProj.world, m_cbWorldViewProj.view);
-      XMMATRIX worldViewProj = XMMatrixTranspose(XMMatrixMultiply(worldView, m_cbWorldViewProj.projection));
+      XMMATRIX worldViewProj = XMMatrixMultiplyTranspose(worldView, m_cbWorldViewProj.projection);
+
+      cbWorld* buffer = (cbWorld*)res.pData;
+      buffer->wvp = worldViewProj;
+      buffer->blackLevel = (g_Windowing.UseLimitedColor() ? 16.f / 255.f : 0.f);
+      buffer->colorRange = (g_Windowing.UseLimitedColor() ? (235.f - 16.f) / 255.f : 1.0f);
 
-      *(XMMATRIX*)res.pData = worldViewProj;
       pContext->Unmap(m_pWVPBuffer, 0);
       m_bIsWVPDirty = false;
     }
index 9bd0a12..6ac1b26 100644 (file)
@@ -107,6 +107,12 @@ private:
     float Width;
     float Height;
   };
+  struct cbWorld
+  {
+    XMMATRIX wvp;
+    float blackLevel;
+    float colorRange;
+  };
 
   void Release(void);
   bool CreateBuffers(void);