| // SwiftShader Software Renderer | |
| // | |
| // Copyright(c) 2005-2012 TransGaming Inc. | |
| // | |
| // All rights reserved. No part of this software may be copied, distributed, transmitted, | |
| // transcribed, stored in a retrieval system, translated into any human or computer | |
| // language by any means, or disclosed to third parties without the explicit written | |
| // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express | |
| // or implied, including but not limited to any patent rights, are granted to you. | |
| // | |
| #ifndef sw_TextureStage_hpp | |
| #define sw_TextureStage_hpp | |
| #include "Common/Types.hpp" | |
| #include "Common/Math.hpp" | |
| #include "Renderer/Color.hpp" | |
| namespace sw | |
| { | |
| class Sampler; | |
| class PixelRoutine; | |
| class Context; | |
| class TextureStage | |
| { | |
| friend class Context; // FIXME | |
| friend class PixelRoutine; // FIXME | |
| public: | |
| enum StageOperation | |
| { | |
| STAGE_DISABLE, | |
| STAGE_SELECTARG1, | |
| STAGE_SELECTARG2, | |
| STAGE_SELECTARG3, | |
| STAGE_MODULATE, | |
| STAGE_MODULATE2X, | |
| STAGE_MODULATE4X, | |
| STAGE_ADD, | |
| STAGE_ADDSIGNED, | |
| STAGE_ADDSIGNED2X, | |
| STAGE_SUBTRACT, | |
| STAGE_ADDSMOOTH, | |
| STAGE_MULTIPLYADD, | |
| STAGE_LERP, | |
| STAGE_DOT3, | |
| STAGE_BLENDCURRENTALPHA, | |
| STAGE_BLENDDIFFUSEALPHA, | |
| STAGE_BLENDFACTORALPHA, | |
| STAGE_BLENDTEXTUREALPHA, | |
| STAGE_BLENDTEXTUREALPHAPM, | |
| STAGE_PREMODULATE, | |
| STAGE_MODULATEALPHA_ADDCOLOR, | |
| STAGE_MODULATECOLOR_ADDALPHA, | |
| STAGE_MODULATEINVALPHA_ADDCOLOR, | |
| STAGE_MODULATEINVCOLOR_ADDALPHA, | |
| STAGE_BUMPENVMAP, | |
| STAGE_BUMPENVMAPLUMINANCE, | |
| STAGE_LAST = STAGE_BUMPENVMAPLUMINANCE | |
| }; | |
| enum SourceArgument | |
| { | |
| SOURCE_TEXTURE, | |
| SOURCE_CONSTANT, | |
| SOURCE_CURRENT, | |
| SOURCE_DIFFUSE, | |
| SOURCE_SPECULAR, | |
| SOURCE_TEMP, | |
| SOURCE_TFACTOR, | |
| SOURCE_LAST = SOURCE_TFACTOR | |
| }; | |
| enum DestinationArgument | |
| { | |
| DESTINATION_CURRENT, | |
| DESTINATION_TEMP, | |
| DESTINATION_LAST = DESTINATION_TEMP | |
| }; | |
| enum ArgumentModifier | |
| { | |
| MODIFIER_COLOR, | |
| MODIFIER_INVCOLOR, | |
| MODIFIER_ALPHA, | |
| MODIFIER_INVALPHA, | |
| MODIFIER_LAST = MODIFIER_INVALPHA | |
| }; | |
| struct State | |
| { | |
| State(); | |
| unsigned int stageOperation : BITS(STAGE_LAST); | |
| unsigned int firstArgument : BITS(SOURCE_LAST); | |
| unsigned int secondArgument : BITS(SOURCE_LAST); | |
| unsigned int thirdArgument : BITS(SOURCE_LAST); | |
| unsigned int stageOperationAlpha : BITS(STAGE_LAST); | |
| unsigned int firstArgumentAlpha : BITS(SOURCE_LAST); | |
| unsigned int secondArgumentAlpha : BITS(SOURCE_LAST); | |
| unsigned int thirdArgumentAlpha : BITS(SOURCE_LAST); | |
| unsigned int firstModifier : BITS(MODIFIER_LAST); | |
| unsigned int secondModifier : BITS(MODIFIER_LAST); | |
| unsigned int thirdModifier : BITS(MODIFIER_LAST); | |
| unsigned int firstModifierAlpha : BITS(MODIFIER_LAST); | |
| unsigned int secondModifierAlpha : BITS(MODIFIER_LAST); | |
| unsigned int thirdModifierAlpha : BITS(MODIFIER_LAST); | |
| unsigned int destinationArgument : BITS(DESTINATION_LAST); | |
| unsigned int texCoordIndex : BITS(7); | |
| unsigned int cantUnderflow : 1; | |
| unsigned int usesTexture : 1; | |
| }; | |
| struct Uniforms | |
| { | |
| word4 constantColor4[4]; | |
| float4 bumpmapMatrix4F[2][2]; | |
| word4 bumpmapMatrix4W[2][2]; | |
| word4 luminanceScale4; | |
| word4 luminanceOffset4; | |
| }; | |
| TextureStage(); | |
| ~TextureStage(); | |
| void init(int stage, const Sampler *sampler, const TextureStage *previousStage); | |
| State textureStageState() const; | |
| void setConstantColor(const Color<float> &constantColor); | |
| void setBumpmapMatrix(int element, float value); | |
| void setLuminanceScale(float value); | |
| void setLuminanceOffset(float value); | |
| void setTexCoordIndex(unsigned int texCoordIndex); | |
| void setStageOperation(StageOperation stageOperation); | |
| void setFirstArgument(SourceArgument firstArgument); | |
| void setSecondArgument(SourceArgument secondArgument); | |
| void setThirdArgument(SourceArgument thirdArgument); | |
| void setStageOperationAlpha(StageOperation stageOperationAlpha); | |
| void setFirstArgumentAlpha(SourceArgument firstArgumentAlpha); | |
| void setSecondArgumentAlpha(SourceArgument secondArgumentAlpha); | |
| void setThirdArgumentAlpha(SourceArgument thirdArgumentAlpha); | |
| void setFirstModifier(ArgumentModifier firstModifier); | |
| void setSecondModifier(ArgumentModifier secondModifier); | |
| void setThirdModifier(ArgumentModifier thirdModifier); | |
| void setFirstModifierAlpha(ArgumentModifier firstModifierAlpha); | |
| void setSecondModifierAlpha(ArgumentModifier secondModifierAlpha); | |
| void setThirdModifierAlpha(ArgumentModifier thirdModifierAlpha); | |
| void setDestinationArgument(DestinationArgument destinationArgument); | |
| Uniforms uniforms; // FIXME: Private | |
| private: | |
| bool usesColor(SourceArgument source) const; | |
| bool usesAlpha(SourceArgument source) const; | |
| bool uses(SourceArgument source) const; | |
| bool usesCurrent() const; | |
| bool usesDiffuse() const; | |
| bool usesSpecular() const; | |
| bool usesTexture() const; | |
| bool isStageDisabled() const; | |
| bool writesCurrent() const; | |
| int stage; | |
| StageOperation stageOperation; | |
| SourceArgument firstArgument; | |
| SourceArgument secondArgument; | |
| SourceArgument thirdArgument; | |
| StageOperation stageOperationAlpha; | |
| SourceArgument firstArgumentAlpha; | |
| SourceArgument secondArgumentAlpha; | |
| SourceArgument thirdArgumentAlpha; | |
| ArgumentModifier firstModifier; | |
| ArgumentModifier secondModifier; | |
| ArgumentModifier thirdModifier; | |
| ArgumentModifier firstModifierAlpha; | |
| ArgumentModifier secondModifierAlpha; | |
| ArgumentModifier thirdModifierAlpha; | |
| DestinationArgument destinationArgument; | |
| int texCoordIndex; | |
| const Sampler *sampler; | |
| const TextureStage *previousStage; | |
| }; | |
| } | |
| #endif sw_TextureStage_hpp |