Commit 548e366a by Chris Forbes

Plumb constants through to the sampler, and make sRGB work

Change-Id: Ib4974a5f0dea325e198905cb94bae138ccac4c6e Test: dEQP-VK.texture.swizzle.component_mapping.* Bug: b/129523279 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/29950Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent 24466043
......@@ -13,6 +13,7 @@
// limitations under the License.
#include "ComputeProgram.hpp"
#include "Constants.hpp"
#include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkPipelineLayout.hpp"
......@@ -49,6 +50,7 @@ namespace sw
routine.descriptorSets = data + OFFSET(Data, descriptorSets);
routine.descriptorDynamicOffsets = data + OFFSET(Data, descriptorDynamicOffsets);
routine.pushConstants = data + OFFSET(Data, pushConstants);
routine.constants = *Pointer<Pointer<Byte>>(data + OFFSET(Data, constants));
auto &modes = shader->getModes();
......@@ -189,6 +191,7 @@ namespace sw
data.numWorkgroups[Z] = groupCountZ;
data.numWorkgroups[3] = 0;
data.pushConstants = pushConstants;
data.constants = &sw::constants;
// TODO(bclayton): Split work across threads.
for (uint32_t groupZ = 0; groupZ < groupCountZ; groupZ++)
......
......@@ -34,6 +34,7 @@ namespace sw
using namespace rr;
class DescriptorSetsLayout;
struct Constants;
// ComputeProgram builds a SPIR-V compute shader.
class ComputeProgram : public Function<Void(Pointer<Byte>)>
......@@ -69,6 +70,7 @@ namespace sw
uint4 numWorkgroups;
uint4 workgroupID;
PushConstantStorage pushConstants;
const Constants *constants;
};
SpirvRoutine routine;
......
......@@ -57,6 +57,7 @@ namespace sw
routine.descriptorSets = data + OFFSET(DrawData, descriptorSets);
routine.descriptorDynamicOffsets = data + OFFSET(DrawData, descriptorDynamicOffsets);
routine.pushConstants = data + OFFSET(DrawData, pushConstants);
routine.constants = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData, constants));
auto it = spirvShader->inputBuiltins.find(spv::BuiltInFrontFacing);
if (it != spirvShader->inputBuiltins.end())
......
......@@ -4517,7 +4517,7 @@ namespace sw
}
Array<SIMD::Float> out(4);
Call<ImageSampler>(samplerFunc, sampledImage.base, &in[0], &out[0]);
Call<ImageSampler>(samplerFunc, sampledImage.base, &in[0], &out[0], state->routine->constants);
for (int i = 0; i < 4; i++) { result.move(i, out[i]); }
......
......@@ -258,7 +258,7 @@ namespace sw
using InsnStore = std::vector<uint32_t>;
InsnStore insns;
using ImageSampler = void(void* image, void* uvsIn, void* texelOut);
using ImageSampler = void(void* image, void* uvsIn, void* texelOut, void* constants);
using GetImageSampler = ImageSampler*(const vk::ImageView *imageView, const vk::Sampler *sampler);
/* Pseudo-iterator over SPIRV instructions, designed to support range-based-for. */
......@@ -868,7 +868,7 @@ namespace sw
static void emitSamplerFunction(
SamplerMethod samplerMethod,
const vk::ImageView *imageView, const vk::Sampler *sampler,
Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out);
Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out, Pointer<Byte> constants);
// TODO(b/129523279): Eliminate conversion and use vk::Sampler members directly.
static sw::TextureType convertTextureType(VkImageViewType imageViewType);
......@@ -898,6 +898,7 @@ namespace sw
Pointer<Pointer<Byte>> descriptorSets;
Pointer<Int> descriptorDynamicOffsets;
Pointer<Byte> pushConstants;
Pointer<Byte> constants;
Int killMask = Int{0};
SIMD::Int windowSpacePosition[2];
......
......@@ -63,11 +63,12 @@ SpirvShader::ImageSampler *SpirvShader::getImageSampler(SamplerMethod samplerMet
if (it != cache.end()) { return it->second; }
// TODO: Hold a separate mutex lock for the sampler being built.
auto function = rr::Function<Void(Pointer<Byte> image, Pointer<SIMD::Float>, Pointer<SIMD::Float>)>();
auto function = rr::Function<Void(Pointer<Byte> image, Pointer<SIMD::Float>, Pointer<SIMD::Float>, Pointer<Byte>)>();
Pointer<Byte> image = function.Arg<0>();
Pointer<SIMD::Float> in = function.Arg<1>();
Pointer<SIMD::Float> out = function.Arg<2>();
emitSamplerFunction(samplerMethod, imageView, sampler, image, in, out);
Pointer<Byte> constants = function.Arg<3>();
emitSamplerFunction(samplerMethod, imageView, sampler, image, in, out, constants);
auto fptr = reinterpret_cast<ImageSampler*>((void *)function("sampler")->getEntry());
cache.emplace(key, fptr);
return fptr;
......@@ -76,10 +77,8 @@ SpirvShader::ImageSampler *SpirvShader::getImageSampler(SamplerMethod samplerMet
void SpirvShader::emitSamplerFunction(
SamplerMethod samplerMethod,
const vk::ImageView *imageView, const vk::Sampler *sampler,
Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out)
Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out, Pointer<Byte> constants)
{
Pointer<Byte> constants; // FIXME(b/129523279)
Sampler::State samplerState;
samplerState.textureType = convertTextureType(imageView->getType());
samplerState.textureFormat = imageView->getFormat();
......@@ -89,7 +88,7 @@ void SpirvShader::emitSamplerFunction(
samplerState.addressingModeV = convertAddressingMode(sampler->addressModeV);
samplerState.addressingModeW = convertAddressingMode(sampler->addressModeW);
samplerState.mipmapFilter = convertMipmapMode(sampler);
samplerState.sRGB = false; ASSERT(imageView->getFormat().isSRGBformat() == false); // TODO(b/129523279)
samplerState.sRGB = imageView->getFormat().isSRGBformat();
samplerState.swizzle = imageView->getComponentMapping();
samplerState.highPrecisionFiltering = false;
samplerState.compare = COMPARE_BYPASS; ASSERT(sampler->compareEnable == VK_FALSE); // TODO(b/129523279)
......
......@@ -44,6 +44,7 @@ namespace sw
routine.descriptorSets = data + OFFSET(DrawData, descriptorSets);
routine.descriptorDynamicOffsets = data + OFFSET(DrawData, descriptorDynamicOffsets);
routine.pushConstants = data + OFFSET(DrawData, pushConstants);
routine.constants = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData, constants));
it = spirvShader->inputBuiltins.find(spv::BuiltInSubgroupSize);
if (it != spirvShader->inputBuiltins.end())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment