Fixed default color values for R and RG types By default, in D3D, R, G or B channels default to 1 when no value is assigned to them. In OpenGL, these channels default to 0. Added an entry to Conventions to fix this issue. In dEQP, this fixes all R and RG types tests from: functional.texture.format.* Change-Id: Ib5552aa36eaf4e3e1132f016f002250b40436227 Reviewed-on: https://swiftshader-review.googlesource.com/10828 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Renderer/Context.cpp b/src/Renderer/Context.cpp index caa4592..e5ee4dc 100644 --- a/src/Renderer/Context.cpp +++ b/src/Renderer/Context.cpp
@@ -33,6 +33,7 @@ bool fullPixelPositionRegister = false; bool leadingVertexFirst = false; // Flat shading uses first vertex, else last bool secondaryColor = false; // Specular lighting is applied after texturing + bool colorsDefaultToZero = false; bool forceWindowed = false; bool quadLayoutEnabled = false;
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp index a67ba22..7afbb9f 100644 --- a/src/Renderer/Renderer.cpp +++ b/src/Renderer/Renderer.cpp
@@ -48,6 +48,7 @@ extern bool fullPixelPositionRegister; extern bool leadingVertexFirst; // Flat shading uses first vertex, else last extern bool secondaryColor; // Specular lighting is applied after texturing + extern bool colorsDefaultToZero; extern bool forceWindowed; extern bool complementaryDepthBuffer; @@ -110,6 +111,7 @@ sw::fullPixelPositionRegister = conventions.fullPixelPositionRegister; sw::leadingVertexFirst = conventions.leadingVertexFirst; sw::secondaryColor = conventions.secondaryColor; + sw::colorsDefaultToZero = conventions.colorsDefaultToZero; sw::exactColorRounding = exactColorRounding; setRenderTarget(0, 0);
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp index c29020f..dedd17a 100644 --- a/src/Renderer/Renderer.hpp +++ b/src/Renderer/Renderer.hpp
@@ -65,6 +65,7 @@ bool fullPixelPositionRegister; bool leadingVertexFirst; bool secondaryColor; + bool colorsDefaultToZero; }; static const Conventions OpenGL = @@ -74,7 +75,8 @@ true, // booleanFaceRegister true, // fullPixelPositionRegister false, // leadingVertexFirst - false // secondaryColor + false, // secondaryColor + true, // colorsDefaultToZero }; static const Conventions Direct3D = @@ -85,6 +87,7 @@ false, // fullPixelPositionRegister true, // leadingVertexFirst true, // secondardyColor + false, // colorsDefaultToZero }; struct Query
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp index f0d482f..0ee9014 100644 --- a/src/Shader/SamplerCore.cpp +++ b/src/Shader/SamplerCore.cpp
@@ -50,6 +50,8 @@ namespace sw { + extern bool colorsDefaultToZero; + SamplerCore::SamplerCore(Pointer<Byte> &constants, const Sampler::State &state) : constants(constants), state(state) { } @@ -186,6 +188,7 @@ if(fixed12 && state.textureFilter != FILTER_GATHER) { int componentCount = textureComponentCount(); + short defaultColorValue = colorsDefaultToZero ? 0x0000 : 0x1000; switch(state.textureFormat) { @@ -237,8 +240,8 @@ case FORMAT_YV12_BT601: case FORMAT_YV12_BT709: case FORMAT_YV12_JFIF: - if(componentCount < 2) c.y = Short4(0x1000); - if(componentCount < 3) c.z = Short4(0x1000); + if(componentCount < 2) c.y = Short4(defaultColorValue); + if(componentCount < 3) c.z = Short4(defaultColorValue); if(componentCount < 4) c.w = Short4(0x1000); break; case FORMAT_A8: @@ -259,9 +262,9 @@ c.z = c.x; break; case FORMAT_R32F: - c.y = Short4(0x1000); + c.y = Short4(defaultColorValue); case FORMAT_G32R32F: - c.z = Short4(0x1000); + c.z = Short4(defaultColorValue); case FORMAT_X32B32G32R32F: c.w = Short4(0x1000); case FORMAT_A32B32G32R32F: @@ -438,6 +441,7 @@ } int componentCount = textureComponentCount(); + float defaultColorValue = colorsDefaultToZero ? 0.0f : 1.0f; if(state.textureFilter != FILTER_GATHER) { @@ -495,8 +499,8 @@ case FORMAT_YV12_BT601: case FORMAT_YV12_BT709: case FORMAT_YV12_JFIF: - if(componentCount < 2) c.y = Float4(1.0f); - if(componentCount < 3) c.z = Float4(1.0f); + if(componentCount < 2) c.y = Float4(defaultColorValue); + if(componentCount < 3) c.z = Float4(defaultColorValue); if(componentCount < 4) c.w = Float4(1.0f); break; case FORMAT_A8: @@ -517,9 +521,9 @@ c.z = c.x; break; case FORMAT_R32F: - c.y = Float4(1.0f); + c.y = Float4(defaultColorValue); case FORMAT_G32R32F: - c.z = Float4(1.0f); + c.z = Float4(defaultColorValue); case FORMAT_X32B32G32R32F: c.w = Float4(1.0f); case FORMAT_A32B32G32R32F: