Use sampler data from sampler descriptor Bug: b/129523279 Test: dEQP-VK.glsl.texture_functions.* Test: dEQP-VK.spirv_assembly.instruction.graphics.image_sampler.* Change-Id: I4c02a36b35a25772e233346266ff6177a9186b9e Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30249 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj b/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj index 2b11b1d..744d11b 100644 --- a/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj +++ b/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj
@@ -212,7 +212,6 @@ <ClCompile Include="$(SolutionDir)src\Device\Renderer.cpp" /> <ClInclude Include="$(SolutionDir)src\Device\Renderer.hpp" /> <ClInclude Include="$(SolutionDir)src\Device\RoutineCache.hpp" /> - <ClCompile Include="$(SolutionDir)src\Device\Sampler.cpp" /> <ClInclude Include="$(SolutionDir)src\Device\Sampler.hpp" /> <ClCompile Include="$(SolutionDir)src\Device\SetupProcessor.cpp" /> <ClInclude Include="$(SolutionDir)src\Device\SetupProcessor.hpp" />
diff --git a/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj.filters b/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj.filters index b361084..f2db70a 100644 --- a/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj.filters +++ b/build/Visual Studio 15 2017 Win64/libvk_swiftshader.vcxproj.filters
@@ -37,9 +37,6 @@ <ClCompile Include="$(SolutionDir)src\Device\Renderer.cpp"> <Filter>src\Device</Filter> </ClCompile> - <ClCompile Include="$(SolutionDir)src\Device\Sampler.cpp"> - <Filter>src\Device</Filter> - </ClCompile> <ClCompile Include="$(SolutionDir)src\Device\SetupProcessor.cpp"> <Filter>src\Device</Filter> </ClCompile>
diff --git a/src/Device/Context.hpp b/src/Device/Context.hpp index a5a69d5..7700440 100644 --- a/src/Device/Context.hpp +++ b/src/Device/Context.hpp
@@ -34,7 +34,7 @@ namespace sw { - class Sampler; + struct Sampler; class PixelShader; class VertexShader; class SpirvShader;
diff --git a/src/Device/PixelProcessor.hpp b/src/Device/PixelProcessor.hpp index b641ab5..6eb8220 100644 --- a/src/Device/PixelProcessor.hpp +++ b/src/Device/PixelProcessor.hpp
@@ -65,7 +65,7 @@ bool frontFaceCCW; VkFormat depthFormat; - Sampler::State sampler[TEXTURE_IMAGE_UNITS]; + Sampler sampler[TEXTURE_IMAGE_UNITS]; }; struct State : States
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp index 9886bce..c343193 100644 --- a/src/Device/Renderer.cpp +++ b/src/Device/Renderer.cpp
@@ -1509,21 +1509,6 @@ PixelProcessor::setRoutineCacheSize(configuration.pixelRoutineCacheSize); SetupProcessor::setRoutineCacheSize(configuration.setupRoutineCacheSize); - switch(configuration.textureSampleQuality) - { - case 0: Sampler::setFilterQuality(FILTER_POINT); break; - case 1: Sampler::setFilterQuality(FILTER_LINEAR); break; - case 2: Sampler::setFilterQuality(FILTER_ANISOTROPIC); break; - default: Sampler::setFilterQuality(FILTER_ANISOTROPIC); break; - } - - switch(configuration.mipmapQuality) - { - case 0: Sampler::setMipmapQuality(MIPMAP_POINT); break; - case 1: Sampler::setMipmapQuality(MIPMAP_LINEAR); break; - default: Sampler::setMipmapQuality(MIPMAP_LINEAR); break; - } - setPerspectiveCorrection(configuration.perspectiveCorrection); switch(configuration.transcendentalPrecision)
diff --git a/src/Device/Sampler.cpp b/src/Device/Sampler.cpp deleted file mode 100644 index 19e2365..0000000 --- a/src/Device/Sampler.cpp +++ /dev/null
@@ -1,438 +0,0 @@ -// Copyright 2016 The SwiftShader Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "Sampler.hpp" - -#include "Context.hpp" -#include "Pipeline/PixelRoutine.hpp" -#include "Vulkan/VkDebug.hpp" -#include "Vulkan/VkImage.hpp" - -#include <cstring> - -namespace sw -{ - FilterType Sampler::maximumTextureFilterQuality = FILTER_LINEAR; - MipmapType Sampler::maximumMipmapFilterQuality = MIPMAP_POINT; - - Sampler::State::State() - { - memset(this, 0, sizeof(State)); - } - - Sampler::Sampler() - { - // FIXME: Mipmap::init - static const unsigned int zero = 0x00FF00FF; - - for(int level = 0; level < MIPMAP_LEVELS; level++) - { - Mipmap &mipmap = texture.mipmap[level]; - - memset(&mipmap, 0, sizeof(Mipmap)); - - for(int face = 0; face < 6; face++) - { - mipmap.buffer[face] = &zero; - } - } - - textureFormat = VK_FORMAT_UNDEFINED; - textureType = TEXTURE_NULL; - - textureFilter = FILTER_LINEAR; - addressingModeU = ADDRESSING_WRAP; - addressingModeV = ADDRESSING_WRAP; - addressingModeW = ADDRESSING_WRAP; - mipmapFilterState = MIPMAP_NONE; - sRGB = false; - gather = false; - highPrecisionFiltering = false; - border = 0; - - swizzle = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }; - - compare = COMPARE_BYPASS; - - exp2LOD = 1.0f; - - texture.maxLod = MAX_TEXTURE_LOD; - texture.minLod = 0; - } - - Sampler::~Sampler() - { - } - - Sampler::State Sampler::samplerState() const - { - State state; - - if(textureType != TEXTURE_NULL) - { - state.textureType = textureType; - state.textureFormat = textureFormat; - state.textureFilter = getTextureFilter(); - state.addressingModeU = getAddressingModeU(); - state.addressingModeV = getAddressingModeV(); - state.addressingModeW = getAddressingModeW(); - state.mipmapFilter = mipmapFilter(); - state.swizzle = swizzle; - state.highPrecisionFiltering = highPrecisionFiltering; - state.compare = getCompareFunc(); - - #if PERF_PROFILE - state.compressedFormat = Surface::isCompressed(externalTextureFormat); - #endif - } - - return state; - } - - void Sampler::setTextureLevel(int face, int level, vk::Image *image, TextureType type) - { - if(image) - { - Mipmap &mipmap = texture.mipmap[level]; - - border = image->isCube() ? 1 : 0; - VkImageSubresourceLayers subresourceLayers = - { - VK_IMAGE_ASPECT_COLOR_BIT, - static_cast<uint32_t>(level), - static_cast<uint32_t>(face), - 1 - }; - mipmap.buffer[face] = image->getTexelPointer({ -border, -border, 0 }, subresourceLayers); - - if(face == 0) - { - VkImageAspectFlagBits aspect = VK_IMAGE_ASPECT_COLOR_BIT; // FIXME: get proper aspect - textureFormat = image->getFormat(aspect); - - VkExtent3D mipLevelExtent = image->getMipLevelExtent(level); - int width = mipLevelExtent.width; - int height = mipLevelExtent.height; - int depth = mipLevelExtent.depth; - int pitchP = image->rowPitchBytes(aspect, level); - int sliceP = image->slicePitchBytes(aspect, level); - - if(level == 0) - { - texture.widthHeightLOD[0] = width * exp2LOD; - texture.widthHeightLOD[1] = width * exp2LOD; - texture.widthHeightLOD[2] = height * exp2LOD; - texture.widthHeightLOD[3] = height * exp2LOD; - - texture.widthLOD[0] = width * exp2LOD; - texture.widthLOD[1] = width * exp2LOD; - texture.widthLOD[2] = width * exp2LOD; - texture.widthLOD[3] = width * exp2LOD; - - texture.heightLOD[0] = height * exp2LOD; - texture.heightLOD[1] = height * exp2LOD; - texture.heightLOD[2] = height * exp2LOD; - texture.heightLOD[3] = height * exp2LOD; - - texture.depthLOD[0] = depth * exp2LOD; - texture.depthLOD[1] = depth * exp2LOD; - texture.depthLOD[2] = depth * exp2LOD; - texture.depthLOD[3] = depth * exp2LOD; - } - - if(textureFormat.isFloatFormat()) - { - mipmap.fWidth[0] = (float)width / 65536.0f; - mipmap.fWidth[1] = (float)width / 65536.0f; - mipmap.fWidth[2] = (float)width / 65536.0f; - mipmap.fWidth[3] = (float)width / 65536.0f; - - mipmap.fHeight[0] = (float)height / 65536.0f; - mipmap.fHeight[1] = (float)height / 65536.0f; - mipmap.fHeight[2] = (float)height / 65536.0f; - mipmap.fHeight[3] = (float)height / 65536.0f; - - mipmap.fDepth[0] = (float)depth / 65536.0f; - mipmap.fDepth[1] = (float)depth / 65536.0f; - mipmap.fDepth[2] = (float)depth / 65536.0f; - mipmap.fDepth[3] = (float)depth / 65536.0f; - } - - short halfTexelU = 0x8000 / width; - short halfTexelV = 0x8000 / height; - short halfTexelW = 0x8000 / depth; - - mipmap.uHalf[0] = halfTexelU; - mipmap.uHalf[1] = halfTexelU; - mipmap.uHalf[2] = halfTexelU; - mipmap.uHalf[3] = halfTexelU; - - mipmap.vHalf[0] = halfTexelV; - mipmap.vHalf[1] = halfTexelV; - mipmap.vHalf[2] = halfTexelV; - mipmap.vHalf[3] = halfTexelV; - - mipmap.wHalf[0] = halfTexelW; - mipmap.wHalf[1] = halfTexelW; - mipmap.wHalf[2] = halfTexelW; - mipmap.wHalf[3] = halfTexelW; - - mipmap.width[0] = width; - mipmap.width[1] = width; - mipmap.width[2] = width; - mipmap.width[3] = width; - - mipmap.height[0] = height; - mipmap.height[1] = height; - mipmap.height[2] = height; - mipmap.height[3] = height; - - mipmap.depth[0] = depth; - mipmap.depth[1] = depth; - mipmap.depth[2] = depth; - mipmap.depth[3] = depth; - - mipmap.onePitchP[0] = 1; - mipmap.onePitchP[1] = pitchP; - mipmap.onePitchP[2] = 1; - mipmap.onePitchP[3] = pitchP; - - mipmap.pitchP[0] = pitchP; - mipmap.pitchP[1] = pitchP; - mipmap.pitchP[2] = pitchP; - mipmap.pitchP[3] = pitchP; - - mipmap.sliceP[0] = sliceP; - mipmap.sliceP[1] = sliceP; - mipmap.sliceP[2] = sliceP; - mipmap.sliceP[3] = sliceP; - - if(textureFormat.hasYuvFormat()) - { - unsigned int YStride = pitchP; - unsigned int YSize = YStride * height; - unsigned int CStride = align<16>(YStride / 2); - unsigned int CSize = CStride * height / 2; - - mipmap.buffer[1] = (byte*)mipmap.buffer[0] + YSize; - mipmap.buffer[2] = (byte*)mipmap.buffer[1] + CSize; - - texture.mipmap[1].width[0] = width / 2; - texture.mipmap[1].width[1] = width / 2; - texture.mipmap[1].width[2] = width / 2; - texture.mipmap[1].width[3] = width / 2; - texture.mipmap[1].height[0] = height / 2; - texture.mipmap[1].height[1] = height / 2; - texture.mipmap[1].height[2] = height / 2; - texture.mipmap[1].height[3] = height / 2; - texture.mipmap[1].onePitchP[0] = 1; - texture.mipmap[1].onePitchP[1] = CStride; - texture.mipmap[1].onePitchP[2] = 1; - texture.mipmap[1].onePitchP[3] = CStride; - } - } - } - - textureType = type; - } - - void Sampler::setTextureFilter(FilterType textureFilter) - { - this->textureFilter = (FilterType)min(textureFilter, maximumTextureFilterQuality); - } - - void Sampler::setMipmapFilter(MipmapType mipmapFilter) - { - mipmapFilterState = (MipmapType)min(mipmapFilter, maximumMipmapFilterQuality); - } - - void Sampler::setGatherEnable(bool enable) - { - gather = enable; - } - - void Sampler::setAddressingModeU(AddressingMode addressingMode) - { - addressingModeU = addressingMode; - } - - void Sampler::setAddressingModeV(AddressingMode addressingMode) - { - addressingModeV = addressingMode; - } - - void Sampler::setAddressingModeW(AddressingMode addressingMode) - { - addressingModeW = addressingMode; - } - - void Sampler::setMaxAnisotropy(float maxAnisotropy) - { - texture.maxAnisotropy = maxAnisotropy; - } - - void Sampler::setHighPrecisionFiltering(bool highPrecisionFiltering) - { - this->highPrecisionFiltering = highPrecisionFiltering; - } - - void Sampler::setCompareFunc(CompareFunc compare) - { - this->compare = compare; - } - - void Sampler::setMinLod(float minLod) - { - texture.minLod = clamp(minLod, 0.0f, (float)(MAX_TEXTURE_LOD)); - } - - void Sampler::setMaxLod(float maxLod) - { - texture.maxLod = clamp(maxLod, 0.0f, (float)(MAX_TEXTURE_LOD)); - } - - void Sampler::setFilterQuality(FilterType maximumFilterQuality) - { - Sampler::maximumTextureFilterQuality = maximumFilterQuality; - } - - void Sampler::setMipmapQuality(MipmapType maximumFilterQuality) - { - Sampler::maximumMipmapFilterQuality = maximumFilterQuality; - } - - void Sampler::setMipmapLOD(float LOD) - { - exp2LOD = exp2(LOD); - } - - bool Sampler::hasTexture() const - { - return textureType != TEXTURE_NULL; - } - - bool Sampler::hasUnsignedTexture() const - { - return textureFormat.isUnsignedComponent(0) && - textureFormat.isUnsignedComponent(1) && - textureFormat.isUnsignedComponent(2) && - textureFormat.isUnsignedComponent(3); - } - - bool Sampler::hasCubeTexture() const - { - return textureType == TEXTURE_CUBE; - } - - bool Sampler::hasVolumeTexture() const - { - return textureType == TEXTURE_3D || textureType == TEXTURE_2D_ARRAY; - } - - const Texture &Sampler::getTextureData() - { - return texture; - } - - MipmapType Sampler::mipmapFilter() const - { - if(mipmapFilterState != MIPMAP_NONE) - { - for(int i = 1; i < MIPMAP_LEVELS; i++) - { - if(texture.mipmap[0].buffer[0] != texture.mipmap[i].buffer[0]) - { - return mipmapFilterState; - } - } - } - - // Only one mipmap level - return MIPMAP_NONE; - } - - TextureType Sampler::getTextureType() const - { - return textureType; - } - - FilterType Sampler::getTextureFilter() const - { - // Don't filter 1x1 textures. - if(texture.mipmap[0].width[0] == 1 && texture.mipmap[0].height[0] == 1 && texture.mipmap[0].depth[0] == 1) - { - if(mipmapFilter() == MIPMAP_NONE) - { - return FILTER_POINT; - } - } - - FilterType filter = textureFilter; - - if(gather && textureFormat.componentCount() == 1) - { - filter = FILTER_GATHER; - } - - if(textureType != TEXTURE_2D || texture.maxAnisotropy == 1.0f) - { - return (FilterType)min(filter, FILTER_LINEAR); - } - - return filter; - } - - AddressingMode Sampler::getAddressingModeU() const - { - if(textureType == TEXTURE_CUBE) - { - return border ? ADDRESSING_SEAMLESS : ADDRESSING_CLAMP; - } - - return addressingModeU; - } - - AddressingMode Sampler::getAddressingModeV() const - { - if(textureType == TEXTURE_CUBE) - { - return border ? ADDRESSING_SEAMLESS : ADDRESSING_CLAMP; - } - - return addressingModeV; - } - - AddressingMode Sampler::getAddressingModeW() const - { - if(textureType == TEXTURE_2D_ARRAY || - textureType == TEXTURE_2D || - textureType == TEXTURE_CUBE || - textureType == TEXTURE_RECTANGLE) - { - return ADDRESSING_LAYER; - } - - return addressingModeW; - } - - CompareFunc Sampler::getCompareFunc() const - { - if(getTextureFilter() == FILTER_GATHER) - { - return COMPARE_BYPASS; - } - - return compare; - } -}
diff --git a/src/Device/Sampler.hpp b/src/Device/Sampler.hpp index af6c428..2347fe0 100644 --- a/src/Device/Sampler.hpp +++ b/src/Device/Sampler.hpp
@@ -50,14 +50,10 @@ { Mipmap mipmap[MIPMAP_LEVELS]; - float4 widthHeightLOD; - float4 widthLOD; - float4 heightLOD; - float4 depthLOD; - - float maxAnisotropy; // FIXME(b/129523279): Part of Vulkan sampler. - float minLod; // FIXME(b/129523279): Part of Vulkan sampler. - float maxLod; // FIXME(b/129523279): Part of Vulkan sampler. + float4 widthWidthHeightHeight; + float4 width; + float4 height; + float4 depth; }; enum SamplerType @@ -143,91 +139,24 @@ SWIZZLE_LAST = SWIZZLE_ONE }; - class Sampler + struct Sampler { - public: - struct State - { - State(); - - TextureType textureType; - vk::Format textureFormat; - FilterType textureFilter; - AddressingMode addressingModeU; - AddressingMode addressingModeV; - AddressingMode addressingModeW; - MipmapType mipmapFilter; - VkComponentMapping swizzle; - bool highPrecisionFiltering; - CompareFunc compare; - VkBorderColor border; - - #if PERF_PROFILE - bool compressedFormat; - #endif - }; - - Sampler(); - - ~Sampler(); - - State samplerState() const; - - void setTextureLevel(int face, int level, vk::Image *image, TextureType type); - - void setTextureFilter(FilterType textureFilter); - void setMipmapFilter(MipmapType mipmapFilter); - void setGatherEnable(bool enable); - void setAddressingModeU(AddressingMode addressingMode); - void setAddressingModeV(AddressingMode addressingMode); - void setAddressingModeW(AddressingMode addressingMode); - void setMaxAnisotropy(float maxAnisotropy); - void setHighPrecisionFiltering(bool highPrecisionFiltering); - void setCompareFunc(CompareFunc compare); - void setMinLod(float minLod); - void setMaxLod(float maxLod); - - static void setFilterQuality(FilterType maximumFilterQuality); - static void setMipmapQuality(MipmapType maximumFilterQuality); - void setMipmapLOD(float lod); - - bool hasTexture() const; - bool hasUnsignedTexture() const; - bool hasCubeTexture() const; - bool hasVolumeTexture() const; - - const Texture &getTextureData(); - - private: - MipmapType mipmapFilter() const; - TextureType getTextureType() const; - FilterType getTextureFilter() const; - AddressingMode getAddressingModeU() const; - AddressingMode getAddressingModeV() const; - AddressingMode getAddressingModeW() const; - CompareFunc getCompareFunc() const; - - vk::Format textureFormat; TextureType textureType; - + vk::Format textureFormat; FilterType textureFilter; AddressingMode addressingModeU; AddressingMode addressingModeV; AddressingMode addressingModeW; - MipmapType mipmapFilterState; + MipmapType mipmapFilter; bool sRGB; - bool gather; - bool highPrecisionFiltering; - int border; - VkComponentMapping swizzle; + bool highPrecisionFiltering; CompareFunc compare; + VkBorderColor border; - Texture texture; - float exp2LOD; - - static FilterType maximumTextureFilterQuality; - static MipmapType maximumMipmapFilterQuality; + #if PERF_PROFILE + bool compressedFormat; + #endif }; }
diff --git a/src/Device/VertexProcessor.hpp b/src/Device/VertexProcessor.hpp index 6d57e71..0c04b6c 100644 --- a/src/Device/VertexProcessor.hpp +++ b/src/Device/VertexProcessor.hpp
@@ -53,7 +53,7 @@ bool textureSampling : 1; // TODO: Eliminate by querying shader. unsigned char verticesPerPrimitive : 2; // 1 (points), 2 (lines) or 3 (triangles) - Sampler::State sampler[VERTEX_TEXTURE_IMAGE_UNITS]; + Sampler sampler[VERTEX_TEXTURE_IMAGE_UNITS]; struct Input {
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp index 96999ac..1bb238c 100644 --- a/src/Pipeline/SamplerCore.cpp +++ b/src/Pipeline/SamplerCore.cpp
@@ -47,7 +47,7 @@ namespace sw { - SamplerCore::SamplerCore(Pointer<Byte> &constants, const Sampler::State &state) : constants(constants), state(state) + SamplerCore::SamplerCore(Pointer<Byte> &constants, const Sampler &state) : constants(constants), state(state) { } @@ -79,18 +79,18 @@ { if(state.textureType != TEXTURE_CUBE) { - computeLod(texture, lod, anisotropy, uDelta, vDelta, uuuu, vvvv, lodOrBias.x, dsx, dsy, function); + computeLod(texture, sampler, lod, anisotropy, uDelta, vDelta, uuuu, vvvv, lodOrBias.x, dsx, dsy, function); } else { Float4 M; cubeFace(face, uuuu, vvvv, u, v, w, M); - computeLodCube(texture, lod, u, v, w, lodOrBias.x, dsx, dsy, M, function); + computeLodCube(texture, sampler, lod, u, v, w, lodOrBias.x, dsx, dsy, M, function); } } else { - computeLod3D(texture, lod, uuuu, vvvv, wwww, lodOrBias.x, dsx, dsy, function); + computeLod3D(texture, sampler, lod, uuuu, vvvv, wwww, lodOrBias.x, dsx, dsy, function); } // FIXME: YUV is not supported by the floating point path @@ -1154,7 +1154,7 @@ return lod; } - void SamplerCore::computeLod(Pointer<Byte> &texture, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &uuuu, Float4 &vvvv, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function) + void SamplerCore::computeLod(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &uuuu, Float4 &vvvv, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function) { if(function != Lod && function != Fetch) { @@ -1172,8 +1172,8 @@ duvdxy = Float4(dudxy.xz, dvdxy.xz); } - // Scale by texture dimensions and sampler LOD bias. - Float4 dUVdxy = duvdxy * *Pointer<Float4>(texture + OFFSET(Texture,widthHeightLOD)); + // Scale by texture dimensions. + Float4 dUVdxy = duvdxy * *Pointer<Float4>(texture + OFFSET(Texture, widthWidthHeightHeight)); Float4 dUV2dxy = dUVdxy * dUVdxy; Float4 dUV2 = dUV2dxy.xy + dUV2dxy.zw; @@ -1194,7 +1194,7 @@ vDelta = As<Float4>((As<Int4>(dvdx) & mask) | ((As<Int4>(dvdy) & ~mask))); anisotropy = lod * Rcp_pp(det); - anisotropy = Min(anisotropy, *Pointer<Float>(texture + OFFSET(Texture,maxAnisotropy))); + anisotropy = Min(anisotropy, *Pointer<Float>(sampler + OFFSET(vk::Sampler,maxAnisotropy))); lod *= Rcp_pp(anisotropy * anisotropy); } @@ -1221,11 +1221,11 @@ } else assert(false); - lod = Max(lod, *Pointer<Float>(texture + OFFSET(Texture, minLod))); - lod = Min(lod, *Pointer<Float>(texture + OFFSET(Texture, maxLod))); + lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod))); + lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod))); } - void SamplerCore::computeLodCube(Pointer<Byte> &texture, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, Float4 &M, SamplerFunction function) + void SamplerCore::computeLodCube(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, Float4 &M, SamplerFunction function) { if(function != Lod && function != Fetch) { @@ -1263,7 +1263,7 @@ lod = Max(Float(dudxy.y), Float(dudxy.z)); // FIXME: Max(dudxy.y, dudxy.z); // Scale by texture dimension and global LOD. - lod *= *Pointer<Float>(texture + OFFSET(Texture,widthLOD)); + lod *= *Pointer<Float>(texture + OFFSET(Texture,width)); lod = log2(lod); @@ -1287,11 +1287,11 @@ } else assert(false); - lod = Max(lod, *Pointer<Float>(texture + OFFSET(Texture, minLod))); - lod = Min(lod, *Pointer<Float>(texture + OFFSET(Texture, maxLod))); + lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod))); + lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod))); } - void SamplerCore::computeLod3D(Pointer<Byte> &texture, Float &lod, Float4 &uuuu, Float4 &vvvv, Float4 &wwww, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function) + void SamplerCore::computeLod3D(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &uuuu, Float4 &vvvv, Float4 &wwww, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function) { if(function != Lod && function != Fetch) { @@ -1311,9 +1311,9 @@ } // Scale by texture dimensions and global LOD. - dudxy *= *Pointer<Float4>(texture + OFFSET(Texture,widthLOD)); - dvdxy *= *Pointer<Float4>(texture + OFFSET(Texture,heightLOD)); - dsdxy *= *Pointer<Float4>(texture + OFFSET(Texture,depthLOD)); + dudxy *= *Pointer<Float4>(texture + OFFSET(Texture, width)); + dvdxy *= *Pointer<Float4>(texture + OFFSET(Texture, height)); + dsdxy *= *Pointer<Float4>(texture + OFFSET(Texture, depth)); dudxy *= dudxy; dvdxy *= dvdxy; @@ -1346,8 +1346,8 @@ } else assert(false); - lod = Max(lod, *Pointer<Float>(texture + OFFSET(Texture, minLod))); - lod = Min(lod, *Pointer<Float>(texture + OFFSET(Texture, maxLod))); + lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod))); + lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod))); } void SamplerCore::cubeFace(Int face[4], Float4 &U, Float4 &V, Float4 &x, Float4 &y, Float4 &z, Float4 &M)
diff --git a/src/Pipeline/SamplerCore.hpp b/src/Pipeline/SamplerCore.hpp index b822299..059daca7 100644 --- a/src/Pipeline/SamplerCore.hpp +++ b/src/Pipeline/SamplerCore.hpp
@@ -58,7 +58,7 @@ class SamplerCore { public: - SamplerCore(Pointer<Byte> &constants, const Sampler::State &state); + SamplerCore(Pointer<Byte> &constants, const Sampler &state); Vector4f sampleTexture(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Float4 &lodOrBias, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerFunction function); @@ -78,9 +78,9 @@ Vector4f sampleFloat3D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function); Float log2sqrt(Float lod); Float log2(Float lod); - void computeLod(Pointer<Byte> &texture, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &u, Float4 &v, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function); - void computeLodCube(Pointer<Byte> &texture, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, Float4 &M, SamplerFunction function); - void computeLod3D(Pointer<Byte> &texture, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function); + void computeLod(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &u, Float4 &v, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function); + void computeLodCube(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, Float4 &M, SamplerFunction function); + void computeLod3D(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function); void cubeFace(Int face[4], Float4 &U, Float4 &V, Float4 &x, Float4 &y, Float4 &z, Float4 &M); Short4 applyOffset(Short4 &uvw, Float4 &offset, const Int4 &whd, AddressingMode mode); void computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4 wwww, Vector4f &offset, const Pointer<Byte> &mipmap, SamplerFunction function); @@ -110,7 +110,7 @@ bool isRGBComponent(int component) const; Pointer<Byte> &constants; - const Sampler::State &state; + const Sampler &state; }; }
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp index 3423968..b8f1c50 100644 --- a/src/Pipeline/SpirvShader.hpp +++ b/src/Pipeline/SpirvShader.hpp
@@ -928,7 +928,7 @@ std::pair<SIMD::Float, SIMD::Int> Frexp(RValue<SIMD::Float> val) const; static ImageSampler *getImageSampler(uint32_t instruction, const vk::ImageView *imageView, const vk::Sampler *sampler); - static ImageSampler *emitSamplerFunction(ImageInstruction instruction, const Sampler::State &samplerState); + static ImageSampler *emitSamplerFunction(ImageInstruction instruction, const Sampler &samplerState); // TODO(b/129523279): Eliminate conversion and use vk::Sampler members directly. static sw::TextureType convertTextureType(VkImageViewType imageViewType);
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp index bd9222d..52bf802 100644 --- a/src/Pipeline/SpirvShaderSampling.cpp +++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -50,7 +50,7 @@ auto it = cache.find(key); if (it != cache.end()) { return it->second; } - Sampler::State samplerState = {}; + Sampler samplerState = {}; samplerState.textureType = convertTextureType(imageView->getType()); samplerState.textureFormat = imageView->getFormat(); samplerState.textureFilter = convertFilterMode(sampler); @@ -78,7 +78,7 @@ return fptr; } -SpirvShader::ImageSampler *SpirvShader::emitSamplerFunction(ImageInstruction instruction, const Sampler::State &samplerState) +SpirvShader::ImageSampler *SpirvShader::emitSamplerFunction(ImageInstruction instruction, const Sampler &samplerState) { // TODO(b/129523279): Hold a separate mutex lock for the sampler being built. Function<Void(Pointer<Byte>, Pointer<Byte>, Pointer<SIMD::Float>, Pointer<SIMD::Float>, Pointer<Byte>)> function;
diff --git a/src/Vulkan/VkDescriptorSetLayout.cpp b/src/Vulkan/VkDescriptorSetLayout.cpp index e769163..f92327c 100644 --- a/src/Vulkan/VkDescriptorSetLayout.cpp +++ b/src/Vulkan/VkDescriptorSetLayout.cpp
@@ -258,12 +258,9 @@ void SampledImageDescriptor::updateSampler(const vk::Sampler *sampler) { - if (sampler) + if(sampler) { - memcpy(&this->sampler, sampler, sizeof(*sampler)); - - texture.minLod = sampler->minLod; - texture.maxLod = sampler->maxLod; + memcpy(&this->sampler, sampler, sizeof(this->sampler)); } } @@ -357,29 +354,27 @@ int pitchP = imageView->rowPitchBytes(aspect, level) / format.bytes(); int sliceP = (layers > 1 ? imageView->layerPitchBytes(aspect) : imageView->slicePitchBytes(aspect, level)) / format.bytes(); - float exp2LOD = 1.0f; - if(mipmapLevel == 0) { - texture->widthHeightLOD[0] = width * exp2LOD; - texture->widthHeightLOD[1] = width * exp2LOD; - texture->widthHeightLOD[2] = height * exp2LOD; - texture->widthHeightLOD[3] = height * exp2LOD; + texture->widthWidthHeightHeight[0] = width; + texture->widthWidthHeightHeight[1] = width; + texture->widthWidthHeightHeight[2] = height; + texture->widthWidthHeightHeight[3] = height; - texture->widthLOD[0] = width * exp2LOD; - texture->widthLOD[1] = width * exp2LOD; - texture->widthLOD[2] = width * exp2LOD; - texture->widthLOD[3] = width * exp2LOD; + texture->width[0] = width; + texture->width[1] = width; + texture->width[2] = width; + texture->width[3] = width; - texture->heightLOD[0] = height * exp2LOD; - texture->heightLOD[1] = height * exp2LOD; - texture->heightLOD[2] = height * exp2LOD; - texture->heightLOD[3] = height * exp2LOD; + texture->height[0] = height; + texture->height[1] = height; + texture->height[2] = height; + texture->height[3] = height; - texture->depthLOD[0] = depth * exp2LOD; - texture->depthLOD[1] = depth * exp2LOD; - texture->depthLOD[2] = depth * exp2LOD; - texture->depthLOD[3] = depth * exp2LOD; + texture->depth[0] = depth; + texture->depth[1] = depth; + texture->depth[2] = depth; + texture->depth[3] = depth; } if(format.isFloatFormat())
diff --git a/src/Vulkan/vulkan.vcxproj b/src/Vulkan/vulkan.vcxproj index 53aa1b9..1157cac 100644 --- a/src/Vulkan/vulkan.vcxproj +++ b/src/Vulkan/vulkan.vcxproj
@@ -148,7 +148,6 @@ <ClCompile Include="..\Device\Point.cpp" /> <ClCompile Include="..\Device\QuadRasterizer.cpp" /> <ClCompile Include="..\Device\Renderer.cpp" /> - <ClCompile Include="..\Device\Sampler.cpp" /> <ClCompile Include="..\Device\SetupProcessor.cpp" /> <ClCompile Include="..\Device\SwiftConfig.cpp" /> <ClCompile Include="..\Device\Vector.cpp" />
diff --git a/src/Vulkan/vulkan.vcxproj.filters b/src/Vulkan/vulkan.vcxproj.filters index f43aabe..916c493 100644 --- a/src/Vulkan/vulkan.vcxproj.filters +++ b/src/Vulkan/vulkan.vcxproj.filters
@@ -57,9 +57,6 @@ <ClCompile Include="..\Device\SetupProcessor.cpp"> <Filter>Source Files\Device</Filter> </ClCompile> - <ClCompile Include="..\Device\Sampler.cpp"> - <Filter>Source Files\Device</Filter> - </ClCompile> <ClCompile Include="..\Device\Renderer.cpp"> <Filter>Source Files\Device</Filter> </ClCompile>