10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License. 50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at 60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software 100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and 130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License. 140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#ifndef sw_PixelProcessor_hpp 160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define sw_PixelProcessor_hpp 170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Context.hpp" 190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "RoutineCache.hpp" 200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace sw 220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens class PixelShader; 240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens class Rasterizer; 250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct Texture; 260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct DrawData; 270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens class PixelProcessor 290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens public: 310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct States 320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int computeHash(); 340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int shaderID; 360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool depthOverride : 1; 380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool shaderContainsKill : 1; 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens DepthCompareMode depthCompareMode : BITS(DEPTH_LAST); 410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens AlphaCompareMode alphaCompareMode : BITS(ALPHA_LAST); 420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool depthWriteEnable : 1; 430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool quadLayoutDepthBuffer : 1; 440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool stencilActive : 1; 460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilCompareMode stencilCompareMode : BITS(STENCIL_LAST); 470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilOperation stencilFailOperation : BITS(OPERATION_LAST); 480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilOperation stencilPassOperation : BITS(OPERATION_LAST); 490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilOperation stencilZFailOperation : BITS(OPERATION_LAST); 500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool noStencilMask : 1; 510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool noStencilWriteMask : 1; 520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool stencilWriteMasked : 1; 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool twoSidedStencil : 1; 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilCompareMode stencilCompareModeCCW : BITS(STENCIL_LAST); 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilOperation stencilFailOperationCCW : BITS(OPERATION_LAST); 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilOperation stencilPassOperationCCW : BITS(OPERATION_LAST); 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens StencilOperation stencilZFailOperationCCW : BITS(OPERATION_LAST); 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool noStencilMaskCCW : 1; 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool noStencilWriteMaskCCW : 1; 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool stencilWriteMaskedCCW : 1; 610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool depthTestActive : 1; 630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool fogActive : 1; 640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens FogMode pixelFogMode : BITS(FOG_LAST); 650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool specularAdd : 1; 660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool occlusionEnabled : 1; 670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool wBasedFog : 1; 680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool perspective : 1; 690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool alphaBlendActive : 1; 710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens BlendFactor sourceBlendFactor : BITS(BLEND_LAST); 720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens BlendFactor destBlendFactor : BITS(BLEND_LAST); 730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens BlendOperation blendOperation : BITS(BLENDOP_LAST); 740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens BlendFactor sourceBlendFactorAlpha : BITS(BLEND_LAST); 750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens BlendFactor destBlendFactorAlpha : BITS(BLEND_LAST); 760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens BlendOperation blendOperationAlpha : BITS(BLENDOP_LAST); 770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int colorWriteMask : RENDERTARGETS * 4; // Four component bit masks 790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Format targetFormat[RENDERTARGETS]; 800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool writeSRGB : 1; 810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int multiSample : 3; 820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int multiSampleMask : 4; 830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST); 840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool centroid : 1; 850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens LogicalOperation logicalOperation : BITS(LOGICALOP_LAST); 870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Sampler::State sampler[TEXTURE_IMAGE_UNITS]; 890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TextureStage::State textureStage[8]; 900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct Interpolant 920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned char component : 4; 940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned char flat : 4; 950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned char project : 2; 960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool centroid : 1; 970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens union 1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct 1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Interpolant color[2]; 1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Interpolant texture[8]; 1053b4c93fea93733b5ab29902ce2b3c864e40d156cNicolas Capens Interpolant fog; 1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1083b4c93fea93733b5ab29902ce2b3c864e40d156cNicolas Capens Interpolant interpolant[MAX_FRAGMENT_INPUTS]; 1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct State : States 1130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens State(); 1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool operator==(const State &state) const; 1170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int colorWriteActive(int index) const 1190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return (colorWriteMask >> (index * 4)) & 0xF; 1210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool alphaTestActive() const 1240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 125a9beed30dd4b2e26452479bc722a35039ce0fb42Alexis Hetu return (alphaCompareMode != ALPHA_ALWAYS) || (transparencyAntialiasing != TRANSPARENCY_NONE); 1260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool pixelFogActive() const 1290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return pixelFogMode != FOG_NONE; 1310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int hash; 1340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 1350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct Stencil 1370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int64_t testMaskQ; 1390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int64_t referenceMaskedQ; 1400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int64_t referenceMaskedSignedQ; 1410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int64_t writeMaskQ; 1420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int64_t invWriteMaskQ; 1430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int64_t referenceQ; 1440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void set(int reference, int testMask, int writeMask) 1460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens referenceQ = replicate(reference); 1480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens testMaskQ = replicate(testMask); 1490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens writeMaskQ = replicate(writeMask); 1500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens invWriteMaskQ = ~writeMaskQ; 1510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens referenceMaskedQ = referenceQ & testMaskQ; 1520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens referenceMaskedSignedQ = replicate((reference + 0x80) & 0xFF & testMask); 1530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens static int64_t replicate(int b) 1560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int64_t w = b & 0xFF; 1580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56); 1600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 1620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct Fog 1640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 scale; 1660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 offset; 1670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens word4 color4[3]; 1680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 colorF[3]; 1690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 densityE; 1700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 density2E; 1710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 1720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct Factor 1740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens word4 textureFactor4[4]; 1760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens word4 alphaReference4; 1780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens word4 blendConstant4W[4]; 1800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 blendConstant4F[4]; 1810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens word4 invBlendConstant4W[4]; 1820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 invBlendConstant4F[4]; 1830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 1840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens public: 1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw); 1870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PixelProcessor(Context *context); 1890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens virtual ~PixelProcessor(); 1910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 192c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFloatConstant(unsigned int index, const float value[4]); 193c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setIntegerConstant(unsigned int index, const int value[4]); 194c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setBooleanConstant(unsigned int index, int boolean); 195c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 196c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setUniformBuffer(int index, sw::Resource* buffer, int offset); 197c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]); 198c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 199c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setRenderTarget(int index, Surface *renderTarget); 200c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setDepthBuffer(Surface *depthBuffer); 201c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilBuffer(Surface *stencilBuffer); 202c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 203c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setTexCoordIndex(unsigned int stage, int texCoordIndex); 204c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation); 205c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument); 206c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument); 207c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument); 208c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha); 209c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha); 210c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha); 211c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha); 212c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier); 213c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier); 214c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier); 215c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha); 216c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha); 217c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha); 218c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument); 219c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setConstantColor(unsigned int stage, const Color<float> &constantColor); 220c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setBumpmapMatrix(unsigned int stage, int element, float value); 221c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setLuminanceScale(unsigned int stage, float value); 222c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setLuminanceOffset(unsigned int stage, float value); 223c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 224c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setTextureFilter(unsigned int sampler, FilterType textureFilter); 225c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter); 226c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setGatherEnable(unsigned int sampler, bool enable); 227c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode); 228c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode); 229c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode); 230c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setReadSRGB(unsigned int sampler, bool sRGB); 231c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setMipmapLOD(unsigned int sampler, float bias); 232c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setBorderColor(unsigned int sampler, const Color<float> &borderColor); 233c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setMaxAnisotropy(unsigned int sampler, float maxAnisotropy); 234010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu void setHighPrecisionFiltering(unsigned int sampler, bool highPrecisionFiltering); 235c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSwizzleR(unsigned int sampler, SwizzleType swizzleR); 236c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSwizzleG(unsigned int sampler, SwizzleType swizzleG); 237c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSwizzleB(unsigned int sampler, SwizzleType swizzleB); 238c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSwizzleA(unsigned int sampler, SwizzleType swizzleA); 239c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setBaseLevel(unsigned int sampler, int baseLevel); 240c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setMaxLevel(unsigned int sampler, int maxLevel); 241c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setMinLod(unsigned int sampler, float minLod); 242c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setMaxLod(unsigned int sampler, float maxLod); 243c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 244c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setWriteSRGB(bool sRGB); 245c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setDepthBufferEnable(bool depthBufferEnable); 246c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setDepthCompare(DepthCompareMode depthCompareMode); 247c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setAlphaCompare(AlphaCompareMode alphaCompareMode); 248c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setDepthWriteEnable(bool depthWriteEnable); 249c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setAlphaTestEnable(bool alphaTestEnable); 250c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setCullMode(CullMode cullMode); 251c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setColorWriteMask(int index, int rgbaMask); 252c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 253c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setColorLogicOpEnabled(bool colorLogicOpEnabled); 254c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setLogicalOperation(LogicalOperation logicalOperation); 255c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 256c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilEnable(bool stencilEnable); 257c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilCompare(StencilCompareMode stencilCompareMode); 258c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilReference(int stencilReference); 259c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilMask(int stencilMask); 260c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilFailOperation(StencilOperation stencilFailOperation); 261c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilPassOperation(StencilOperation stencilPassOperation); 262c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilZFailOperation(StencilOperation stencilZFailOperation); 263c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilWriteMask(int stencilWriteMask); 264c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setTwoSidedStencil(bool enable); 265c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilCompareCCW(StencilCompareMode stencilCompareMode); 266c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilReferenceCCW(int stencilReference); 267c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilMaskCCW(int stencilMask); 268c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilFailOperationCCW(StencilOperation stencilFailOperation); 269c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilPassOperationCCW(StencilOperation stencilPassOperation); 270c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation); 271c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setStencilWriteMaskCCW(int stencilWriteMask); 272c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 273c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setTextureFactor(const Color<float> &textureFactor); 274c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setBlendConstant(const Color<float> &blendConstant); 275c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 276c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFillMode(FillMode fillMode); 277c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setShadingMode(ShadingMode shadingMode); 278c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 279c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setAlphaBlendEnable(bool alphaBlendEnable); 280c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSourceBlendFactor(BlendFactor sourceBlendFactor); 281c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setDestBlendFactor(BlendFactor destBlendFactor); 282c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setBlendOperation(BlendOperation blendOperation); 283c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 284c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); 285c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha); 286c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha); 287c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setBlendOperationAlpha(BlendOperation blendOperationAlpha); 288c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 289c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setAlphaReference(float alphaReference); 290c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 291c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setGlobalMipmapBias(float bias); 292c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 293c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFogStart(float start); 294c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFogEnd(float end); 295c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFogColor(Color<float> fogColor); 296c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setFogDensity(float fogDensity); 297c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setPixelFogMode(FogMode fogMode); 298c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 299c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setPerspectiveCorrection(bool perspectiveCorrection); 300c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu 301c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu void setOcclusionEnabled(bool enable); 3020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens protected: 3040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const State update() const; 3050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Routine *routine(const State &state); 3060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void setRoutineCacheSize(int routineCacheSize); 3070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Shader constants 3090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens word4 cW[8][4]; 3100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float4 c[FRAGMENT_UNIFORM_VECTORS]; 3110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int4 i[16]; 3120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool b[16]; 3130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Other semi-constants 3150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Stencil stencil; 3160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Stencil stencilCCW; 3170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Fog fog; 3180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Factor factor; 3190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens private: 3210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens struct UniformBufferInfo 3220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UniformBufferInfo(); 3240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Resource* buffer; 3260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int offset; 3270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 3280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS]; 3290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void setFogRanges(float start, float end); 3310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Context *const context; 3330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens RoutineCache<State> *routineCache; 3350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 3360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif // sw_PixelProcessor_hpp 339