Home | History | Annotate | Download | only in Renderer
      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_TextureStage_hpp
     16 #define sw_TextureStage_hpp
     17 
     18 #include "Common/Types.hpp"
     19 #include "Common/Math.hpp"
     20 #include "Renderer/Color.hpp"
     21 
     22 namespace sw
     23 {
     24 	class Sampler;
     25 	class PixelRoutine;
     26 	class Context;
     27 
     28 	class TextureStage
     29 	{
     30 		friend class Context;   // FIXME
     31 
     32 	public:
     33 		enum StageOperation
     34 		{
     35 			STAGE_DISABLE,
     36 			STAGE_SELECTARG1,
     37 			STAGE_SELECTARG2,
     38 			STAGE_SELECTARG3,
     39 			STAGE_MODULATE,
     40 			STAGE_MODULATE2X,
     41 			STAGE_MODULATE4X,
     42 			STAGE_ADD,
     43 			STAGE_ADDSIGNED,
     44 			STAGE_ADDSIGNED2X,
     45 			STAGE_SUBTRACT,
     46 			STAGE_ADDSMOOTH,
     47 			STAGE_MULTIPLYADD,
     48 			STAGE_LERP,
     49 			STAGE_DOT3,
     50 			STAGE_BLENDCURRENTALPHA,
     51 			STAGE_BLENDDIFFUSEALPHA,
     52 			STAGE_BLENDFACTORALPHA,
     53 			STAGE_BLENDTEXTUREALPHA,
     54 			STAGE_BLENDTEXTUREALPHAPM,
     55 			STAGE_PREMODULATE,
     56 			STAGE_MODULATEALPHA_ADDCOLOR,
     57 			STAGE_MODULATECOLOR_ADDALPHA,
     58 			STAGE_MODULATEINVALPHA_ADDCOLOR,
     59 			STAGE_MODULATEINVCOLOR_ADDALPHA,
     60 			STAGE_BUMPENVMAP,
     61 			STAGE_BUMPENVMAPLUMINANCE,
     62 
     63 			STAGE_LAST = STAGE_BUMPENVMAPLUMINANCE
     64 		};
     65 
     66 		enum SourceArgument
     67 		{
     68 			SOURCE_TEXTURE,
     69 			SOURCE_CONSTANT,
     70 			SOURCE_CURRENT,
     71 			SOURCE_DIFFUSE,
     72 			SOURCE_SPECULAR,
     73 			SOURCE_TEMP,
     74 			SOURCE_TFACTOR,
     75 
     76 			SOURCE_LAST = SOURCE_TFACTOR
     77 		};
     78 
     79 		enum DestinationArgument
     80 		{
     81 			DESTINATION_CURRENT,
     82 			DESTINATION_TEMP,
     83 
     84 			DESTINATION_LAST = DESTINATION_TEMP
     85 		};
     86 
     87 		enum ArgumentModifier
     88 		{
     89 			MODIFIER_COLOR,
     90 			MODIFIER_INVCOLOR,
     91 			MODIFIER_ALPHA,
     92 			MODIFIER_INVALPHA,
     93 
     94 			MODIFIER_LAST = MODIFIER_INVALPHA
     95 		};
     96 
     97 		struct State
     98 		{
     99 			State();
    100 
    101 			unsigned int stageOperation			: BITS(STAGE_LAST);
    102 			unsigned int firstArgument			: BITS(SOURCE_LAST);
    103 			unsigned int secondArgument			: BITS(SOURCE_LAST);
    104 			unsigned int thirdArgument			: BITS(SOURCE_LAST);
    105 			unsigned int stageOperationAlpha	: BITS(STAGE_LAST);
    106 			unsigned int firstArgumentAlpha		: BITS(SOURCE_LAST);
    107 			unsigned int secondArgumentAlpha	: BITS(SOURCE_LAST);
    108 			unsigned int thirdArgumentAlpha		: BITS(SOURCE_LAST);
    109 			unsigned int firstModifier			: BITS(MODIFIER_LAST);
    110 			unsigned int secondModifier			: BITS(MODIFIER_LAST);
    111 			unsigned int thirdModifier			: BITS(MODIFIER_LAST);
    112 			unsigned int firstModifierAlpha		: BITS(MODIFIER_LAST);
    113 			unsigned int secondModifierAlpha	: BITS(MODIFIER_LAST);
    114 			unsigned int thirdModifierAlpha		: BITS(MODIFIER_LAST);
    115 			unsigned int destinationArgument	: BITS(DESTINATION_LAST);
    116 			unsigned int texCoordIndex			: BITS(7);
    117 
    118 			unsigned int cantUnderflow			: 1;
    119 			unsigned int usesTexture			: 1;
    120 		};
    121 
    122 		struct Uniforms
    123 		{
    124 			word4 constantColor4[4];
    125 			float4 bumpmapMatrix4F[2][2];
    126 			word4 bumpmapMatrix4W[2][2];
    127 			word4 luminanceScale4;
    128 			word4 luminanceOffset4;
    129 		};
    130 
    131 		TextureStage();
    132 
    133 		~TextureStage();
    134 
    135 		void init(int stage, const Sampler *sampler, const TextureStage *previousStage);
    136 
    137 		State textureStageState() const;
    138 
    139 		void setConstantColor(const Color<float> &constantColor);
    140 		void setBumpmapMatrix(int element, float value);
    141 		void setLuminanceScale(float value);
    142 		void setLuminanceOffset(float value);
    143 
    144 		void setTexCoordIndex(unsigned int texCoordIndex);
    145 		void setStageOperation(StageOperation stageOperation);
    146 		void setFirstArgument(SourceArgument firstArgument);
    147 		void setSecondArgument(SourceArgument secondArgument);
    148 		void setThirdArgument(SourceArgument thirdArgument);
    149 		void setStageOperationAlpha(StageOperation stageOperationAlpha);
    150 		void setFirstArgumentAlpha(SourceArgument firstArgumentAlpha);
    151 		void setSecondArgumentAlpha(SourceArgument secondArgumentAlpha);
    152 		void setThirdArgumentAlpha(SourceArgument thirdArgumentAlpha);
    153 		void setFirstModifier(ArgumentModifier firstModifier);
    154 		void setSecondModifier(ArgumentModifier secondModifier);
    155 		void setThirdModifier(ArgumentModifier thirdModifier);
    156 		void setFirstModifierAlpha(ArgumentModifier firstModifierAlpha);
    157 		void setSecondModifierAlpha(ArgumentModifier secondModifierAlpha);
    158 		void setThirdModifierAlpha(ArgumentModifier thirdModifierAlpha);
    159 		void setDestinationArgument(DestinationArgument destinationArgument);
    160 
    161 		Uniforms uniforms;   // FIXME: Private
    162 
    163 	private:
    164 		bool usesColor(SourceArgument source) const;
    165 		bool usesAlpha(SourceArgument source) const;
    166 		bool uses(SourceArgument source) const;
    167 		bool usesCurrent() const;
    168 		bool usesDiffuse() const;
    169 		bool usesSpecular() const;
    170 		bool usesTexture() const;
    171 		bool isStageDisabled() const;
    172 		bool writesCurrent() const;
    173 
    174 		int stage;
    175 
    176 		StageOperation stageOperation;
    177 		SourceArgument firstArgument;
    178 		SourceArgument secondArgument;
    179 		SourceArgument thirdArgument;
    180 		StageOperation stageOperationAlpha;
    181 		SourceArgument firstArgumentAlpha;
    182 		SourceArgument secondArgumentAlpha;
    183 		SourceArgument thirdArgumentAlpha;
    184 		ArgumentModifier firstModifier;
    185 		ArgumentModifier secondModifier;
    186 		ArgumentModifier thirdModifier;
    187 		ArgumentModifier firstModifierAlpha;
    188 		ArgumentModifier secondModifierAlpha;
    189 		ArgumentModifier thirdModifierAlpha;
    190 		DestinationArgument destinationArgument;
    191 
    192 		int texCoordIndex;
    193 		const Sampler *sampler;
    194 		const TextureStage *previousStage;
    195 	};
    196 }
    197 
    198 #endif  // sw_TextureStage_hpp
    199