blob: 2c9ecbdea23cba9570f41e20dc61dcee6912588f [file] [log] [blame] [edit]
// 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