1// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef sw_SamplerCore_hpp
16#define sw_SamplerCore_hpp
17
18#include "ShaderCore.hpp"
19#include "Device/Sampler.hpp"
20#include "Reactor/Print.hpp"
21#include "Reactor/Reactor.hpp"
22
23#ifdef None
24#undef None // b/127920555
25#endif
26
27namespace sw
28{
29 using namespace rr;
30
31 enum SamplerMethod : uint32_t
32 {
33 Implicit, // Compute gradients (pixel shader only).
34 Bias, // Compute gradients and add provided bias.
35 Lod, // Use provided LOD.
36 Grad, // Use provided gradients.
37 Fetch, // Use provided integer coordinates.
38 Base, // Sample base level.
39 Query, // Return implicit LOD.
40 Gather, // Return one channel of each texel in footprint.
41 SAMPLER_METHOD_LAST = Gather,
42 };
43
44 // TODO(b/129523279): Eliminate and use SpirvShader::ImageInstruction instead.
45 struct SamplerFunction
46 {
47 SamplerFunction(SamplerMethod method, bool offset = false, bool sample = false)
48 : method(method), offset(offset), sample(sample)
49 {}
50
51 operator SamplerMethod() { return method; }
52
53 const SamplerMethod method;
54 const bool offset;
55 const bool sample;
56 };
57
58 class SamplerCore
59 {
60 public:
61 SamplerCore(Pointer<Byte> &constants, const Sampler &state);
62
63 Vector4f sampleTexture(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Float &&lodOrBias, Float4 &dsx, Float4 &dsy, Vector4f &offset, SamplerFunction function);
64
65 private:
66 Short4 offsetSample(Short4 &uvw, Pointer<Byte> &mipmap, int halfOffset, bool wrap, int count, Float &lod);
67 Vector4s sampleFilter(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, SamplerFunction function);
68 Vector4s sampleAniso(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, bool secondLOD, SamplerFunction function);
69 Vector4s sampleQuad(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function);
70 Vector4s sampleQuad2D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function);
71 Vector4s sample3D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function);
72 Vector4f sampleFloatFilter(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &offset, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, SamplerFunction function);
73 Vector4f sampleFloatAniso(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &offset, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, bool secondLOD, SamplerFunction function);
74 Vector4f sampleFloat(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function);
75 Vector4f sampleFloat2D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function);
76 Vector4f sampleFloat3D(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function);
77 Float log2sqrt(Float lod);
78 Float log2(Float lod);
79 void computeLod(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &u, Float4 &v, Float4 &dsx, Float4 &dsy, SamplerFunction function);
80 void computeLodCube(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &u, Float4 &v, Float4 &w, Float4 &dsx, Float4 &dsy, Float4 &M, SamplerFunction function);
81 void computeLod3D(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &u, Float4 &v, Float4 &w, Float4 &dsx, Float4 &dsy, SamplerFunction function);
82 Int4 cubeFace(Float4 &U, Float4 &V, Float4 &x, Float4 &y, Float4 &z, Float4 &M);
83 Short4 applyOffset(Short4 &uvw, Float4 &offset, const Int4 &whd, AddressingMode mode);
84 void computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4 wwww, Vector4f &offset, const Pointer<Byte> &mipmap, SamplerFunction function);
85 void computeIndices(UInt index[4], Int4 uuuu, Int4 vvvv, Int4 wwww, Int4 valid, const Pointer<Byte> &mipmap, SamplerFunction function);
86 Vector4s sampleTexel(Short4 &u, Short4 &v, Short4 &s, Vector4f &offset, Pointer<Byte> &mipmap, Pointer<Byte> buffer, SamplerFunction function);
87 Vector4s sampleTexel(UInt index[4], Pointer<Byte> buffer);
88 Vector4f sampleTexel(Int4 &u, Int4 &v, Int4 &s, Float4 &z, Pointer<Byte> &mipmap, Pointer<Byte> buffer, SamplerFunction function);
89 Vector4f replaceBorderTexel(const Vector4f &c, Int4 valid);
90 void selectMipmap(const Pointer<Byte> &texture, Pointer<Byte> &mipmap, Pointer<Byte> &buffer, const Float &lod, bool secondLOD);
91 Short4 address(Float4 &uw, AddressingMode addressingMode, Pointer<Byte>& mipmap);
92 void address(Float4 &uw, Int4& xyz0, Int4& xyz1, Float4& f, Pointer<Byte>& mipmap, Float4 &texOffset, Int4 &filter, int whd, AddressingMode addressingMode, SamplerFunction function);
93 Int4 computeFilterOffset(Float &lod);
94
95 void convertSigned15(Float4 &cf, Short4 &ci);
96 void convertUnsigned16(Float4 &cf, Short4 &ci);
97 void sRGBtoLinear16_8_16(Short4 &c);
98
99 bool hasFloatTexture() const;
100 bool hasUnnormalizedIntegerTexture() const;
101 bool hasUnsignedTextureComponent(int component) const;
102 int textureComponentCount() const;
103 bool hasThirdCoordinate() const;
104 bool has16bitTextureFormat() const;
105 bool has8bitTextureComponents() const;
106 bool has16bitTextureComponents() const;
107 bool has32bitIntegerTextureComponents() const;
108 bool hasQuadLayout() const;
109 bool isYcbcrFormat() const;
110 bool isRGBComponent(int component) const;
111 bool borderModeActive() const;
112 VkComponentSwizzle gatherSwizzle() const;
113
114 Pointer<Byte> &constants;
115 const Sampler &state;
116 };
117}
118
119#ifdef ENABLE_RR_PRINT
120namespace rr {
121 template <> struct PrintValue::Ty<sw::SamplerFunction>
122 {
123 static std::string fmt(const sw::SamplerFunction& v)
124 {
125 return std::string("SamplerFunction[") +
126 "method: " + std::to_string(v.method) +
127 ", offset: " + std::to_string(v.offset) +
128 ", sample: " + std::to_string(v.sample) +
129 "]";
130 }
131
132 static std::vector<rr::Value*> val(const sw::SamplerFunction& v) { return {}; }
133 };
134}
135#endif // ENABLE_RR_PRINT
136
137#endif // sw_SamplerCore_hpp
138