• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_PixelRoutine_hpp
16 #define sw_PixelRoutine_hpp
17 
18 #include "Device/QuadRasterizer.hpp"
19 
20 namespace sw {
21 
22 class PixelShader;
23 class SamplerCore;
24 
25 class PixelRoutine : public sw::QuadRasterizer
26 {
27 public:
28 	PixelRoutine(const PixelProcessor::State &state,
29 	             vk::PipelineLayout const *pipelineLayout,
30 	             SpirvShader const *spirvShader,
31 	             const vk::DescriptorSet::Bindings &descriptorSets);
32 
33 	virtual ~PixelRoutine();
34 
35 protected:
36 	Float4 z[4];  // Multisampled z
37 	Float4 w;     // Used as is
38 	Float4 rhw;   // Reciprocal w
39 
40 	SpirvRoutine routine;
41 	const vk::DescriptorSet::Bindings &descriptorSets;
42 
43 	// Depth output
44 	Float4 oDepth;
45 
46 	virtual void setBuiltins(Int &x, Int &y, Float4 (&z)[4], Float4 &w, Int cMask[4]) = 0;
47 	virtual void applyShader(Int cMask[4], Int sMask[4], Int zMask[4]) = 0;
48 	virtual Bool alphaTest(Int cMask[4]) = 0;
49 	virtual void rasterOperation(Pointer<Byte> cBuffer[4], Int &x, Int sMask[4], Int zMask[4], Int cMask[4]) = 0;
50 
51 	void quad(Pointer<Byte> cBuffer[4], Pointer<Byte> &zBuffer, Pointer<Byte> &sBuffer, Int cMask[4], Int &x, Int &y) override;
52 
53 	void alphaTest(Int &aMask, const Short4 &alpha);
54 	void alphaToCoverage(Int cMask[4], const Float4 &alpha);
55 
56 	// Raster operations
57 	void alphaBlend(int index, const Pointer<Byte> &cBuffer, Vector4s &current, const Int &x);
58 	void writeColor(int index, const Pointer<Byte> &cBuffer, const Int &x, Vector4f &oC, const Int &sMask, const Int &zMask, const Int &cMask);
59 	void alphaBlend(int index, const Pointer<Byte> &cBuffer, Vector4f &oC, const Int &x);
60 	void writeColor(int index, const Pointer<Byte> &cBuffer, const Int &x, Vector4s &current, const Int &sMask, const Int &zMask, const Int &cMask);
61 
62 	bool isSRGB(int index) const;
63 	UShort4 convertFixed16(const Float4 &cf, bool saturate = true);
64 	void linearToSRGB12_16(Vector4s &c);
65 
66 private:
67 	Float4 interpolateCentroid(const Float4 &x, const Float4 &y, const Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective);
68 	Byte8 stencilReplaceRef(bool isBack);
69 	void stencilTest(const Pointer<Byte> &sBuffer, int q, const Int &x, Int &sMask, const Int &cMask);
70 	void stencilTest(Byte8 &value, VkCompareOp stencilCompareMode, bool isBack);
71 	void stencilOperation(Byte8 &newValue, const Byte8 &bufferValue, const PixelProcessor::States::StencilOpState &ops, bool isBack, const Int &zMask, const Int &sMask);
72 	void stencilOperation(Byte8 &output, const Byte8 &bufferValue, VkStencilOp operation, bool isBack);
73 	Bool depthTest(const Pointer<Byte> &zBuffer, int q, const Int &x, const Float4 &z, const Int &sMask, Int &zMask, const Int &cMask);
74 
75 	// Raster operations
76 	void blendFactor(Vector4s &blendFactor, const Vector4s &current, const Vector4s &pixel, VkBlendFactor blendFactorActive);
77 	void blendFactorAlpha(Vector4s &blendFactor, const Vector4s &current, const Vector4s &pixel, VkBlendFactor blendFactorAlphaActive);
78 	void readPixel(int index, const Pointer<Byte> &cBuffer, const Int &x, Vector4s &pixel);
79 	void blendFactor(Vector4f &blendFactor, const Vector4f &oC, const Vector4f &pixel, VkBlendFactor blendFactorActive);
80 	void blendFactorAlpha(Vector4f &blendFactor, const Vector4f &oC, const Vector4f &pixel, VkBlendFactor blendFactorAlphaActive);
81 	void writeStencil(Pointer<Byte> &sBuffer, int q, const Int &x, const Int &sMask, const Int &zMask, const Int &cMask);
82 	void writeDepth(Pointer<Byte> &zBuffer, int q, const Int &x, const Float4 &z, const Int &zMask);
83 
84 	void sRGBtoLinear16_12_16(Vector4s &c);
85 	void linearToSRGB16_12_16(Vector4s &c);
86 	Float4 sRGBtoLinear(const Float4 &x);
87 
88 	Bool depthTest32F(const Pointer<Byte> &zBuffer, int q, const Int &x, const Float4 &z, const Int &sMask, Int &zMask, const Int &cMask);
89 	Bool depthTest16(const Pointer<Byte> &zBuffer, int q, const Int &x, const Float4 &z, const Int &sMask, Int &zMask, const Int &cMask);
90 
91 	void writeDepth32F(Pointer<Byte> &zBuffer, int q, const Int &x, const Float4 &z, const Int &zMask);
92 	void writeDepth16(Pointer<Byte> &zBuffer, int q, const Int &x, const Float4 &z, const Int &zMask);
93 };
94 
95 }  // namespace sw
96 
97 #endif  // sw_PixelRoutine_hpp
98