From: Nicolas Capens Date: Wed, 28 Nov 2018 22:33:24 +0000 (-0500) Subject: Work around Subzero constant folding limitation. X-Git-Tag: android-x86-9.0-r1~493 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=a972758d6e10df761631daf1f33a2ef2a17cb699;p=android-x86%2Fexternal-swiftshader.git Work around Subzero constant folding limitation. The Subzero JIT only supports constants in the second operand of arithmetic operations, not the first. It assumes constant folding already took place (true for NaCl which takes LLVM IR as input). Reactor has constant folding as part of the static C++ compilation, but the Optimizer may substitute the first operand for a constant (i.e. constant propagation). Addressing it in the Optimizer by not performing the substitution is not trivial because we'd have to check each use. And it would cost run-time performance. Ideally we'd have a pass for legalization/optimization which performs constant folding. For now, avoid hitting 'unreachable' code in Subzero by multiplying constants at the Reactor level. Fixes regression caused by https://swiftshader-review.googlesource.com/22910 Bug chromium:904265 Bug swiftshader:14 Change-Id: Ifdc72ac997ad5d71c1f7006259f54f3d715cb613 Reviewed-on: https://swiftshader-review.googlesource.com/c/22930 Tested-by: Nicolas Capens Reviewed-by: Nicolas Capens --- diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp index 5b5df4532..4ebe3e06e 100644 --- a/src/Pipeline/PixelProgram.cpp +++ b/src/Pipeline/PixelProgram.cpp @@ -1255,8 +1255,8 @@ namespace sw void PixelProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1) { bool uniformSampler = (src1.type == Shader::PARAMETER_SAMPLER && src1.rel.type == Shader::PARAMETER_VOID); - Int index = uniformSampler ? src1.index : As(Float(fetchRegister(src1).x.x)); - Pointer texture = data + OFFSET(DrawData, mipmap) + index * sizeof(Texture); + Int offset = uniformSampler ? src1.index * sizeof(Texture) : As(Float(fetchRegister(src1).x.x)) * sizeof(Texture); + Pointer texture = data + OFFSET(DrawData, mipmap) + offset; dst = SamplerCore::textureSize(texture, lod); } diff --git a/src/Pipeline/VertexProgram.cpp b/src/Pipeline/VertexProgram.cpp index 3ad21565f..e5241f3cf 100644 --- a/src/Pipeline/VertexProgram.cpp +++ b/src/Pipeline/VertexProgram.cpp @@ -1525,8 +1525,8 @@ namespace sw void VertexProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1) { bool uniformSampler = (src1.type == Shader::PARAMETER_SAMPLER && src1.rel.type == Shader::PARAMETER_VOID); - Int index = uniformSampler ? src1.index : As(Float(fetchRegister(src1).x.x)); - Pointer texture = data + OFFSET(DrawData, mipmap[TEXTURE_IMAGE_UNITS]) + index * sizeof(Texture); + Int offset = uniformSampler ? src1.index * sizeof(Texture) : As(Float(fetchRegister(src1).x.x)) * sizeof(Texture); + Pointer texture = data + OFFSET(DrawData, mipmap[TEXTURE_IMAGE_UNITS]) + offset; dst = SamplerCore::textureSize(texture, lod); } diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp index 06ece40eb..671b0ef50 100644 --- a/src/Shader/PixelProgram.cpp +++ b/src/Shader/PixelProgram.cpp @@ -1280,8 +1280,8 @@ namespace sw void PixelProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1) { bool uniformSampler = (src1.type == Shader::PARAMETER_SAMPLER && src1.rel.type == Shader::PARAMETER_VOID); - Int index = uniformSampler ? src1.index : As(Float(fetchRegister(src1).x.x)); - Pointer texture = data + OFFSET(DrawData, mipmap) + index * sizeof(Texture); + Int offset = uniformSampler ? src1.index * sizeof(Texture) : As(Float(fetchRegister(src1).x.x)) * sizeof(Texture); + Pointer texture = data + OFFSET(DrawData, mipmap) + offset; dst = SamplerCore::textureSize(texture, lod); } diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp index a74a37fe0..bde7531af 100644 --- a/src/Shader/VertexProgram.cpp +++ b/src/Shader/VertexProgram.cpp @@ -1609,8 +1609,8 @@ namespace sw void VertexProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1) { bool uniformSampler = (src1.type == Shader::PARAMETER_SAMPLER && src1.rel.type == Shader::PARAMETER_VOID); - Int index = uniformSampler ? src1.index : As(Float(fetchRegister(src1).x.x)); - Pointer texture = data + OFFSET(DrawData, mipmap[TEXTURE_IMAGE_UNITS]) + index * sizeof(Texture); + Int offset = uniformSampler ? src1.index * sizeof(Texture) : As(Float(fetchRegister(src1).x.x)) * sizeof(Texture); + Pointer texture = data + OFFSET(DrawData, mipmap[TEXTURE_IMAGE_UNITS]) + offset; dst = SamplerCore::textureSize(texture, lod); }