// 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.
|
|
#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
|
|
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
|