1 // Copyright (c) 2015- PPSSPP Project. 2 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU General Public License as published by 5 // the Free Software Foundation, version 2.0 or later versions. 6 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 // GNU General Public License 2.0 for more details. 11 12 // A copy of the GPL 2.0 should have been included with the program. 13 // If not, see http://www.gnu.org/licenses/ 14 15 // Official git repository and contact information can be found at 16 // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. 17 18 #pragma once 19 20 #include <cstdint> 21 #include <vector> 22 23 namespace Draw { 24 class DrawContext; 25 } 26 27 enum DebugShaderType { 28 SHADER_TYPE_VERTEX = 0, 29 SHADER_TYPE_FRAGMENT = 1, 30 SHADER_TYPE_GEOMETRY = 2, 31 SHADER_TYPE_VERTEXLOADER = 3, // Not really a shader, but might as well re-use this mechanism 32 SHADER_TYPE_PIPELINE = 4, // Vulkan and DX12 combines a bunch of state into pipeline objects. Might as well make them inspectable. 33 SHADER_TYPE_DEPAL = 5, 34 SHADER_TYPE_SAMPLER = 6, // Not really a shader either. Need to rename this enum... 35 }; 36 37 enum DebugShaderStringType { 38 SHADER_STRING_SHORT_DESC = 0, 39 SHADER_STRING_SOURCE_CODE = 1, 40 SHADER_STRING_STATS = 2, 41 }; 42 43 // Shared between the backends. Not all are necessarily used by each backend, but this lets us share 44 // more code than before. TODO: Can probably cut the number of these down without too much slowdown. 45 enum : uint64_t { 46 DIRTY_PROJMATRIX = 1ULL << 0, 47 DIRTY_PROJTHROUGHMATRIX = 1ULL << 1, 48 DIRTY_FOGCOLOR = 1ULL << 2, 49 DIRTY_FOGCOEF = 1ULL << 3, 50 DIRTY_TEXENV = 1ULL << 4, 51 DIRTY_ALPHACOLORREF = 1ULL << 5, 52 53 DIRTY_STENCILREPLACEVALUE = 1ULL << 6, 54 55 DIRTY_ALPHACOLORMASK = 1ULL << 7, 56 DIRTY_LIGHT0 = 1ULL << 8, 57 DIRTY_LIGHT1 = 1ULL << 9, 58 DIRTY_LIGHT2 = 1ULL << 10, 59 DIRTY_LIGHT3 = 1ULL << 11, 60 61 DIRTY_MATDIFFUSE = 1ULL << 12, 62 DIRTY_MATSPECULAR = 1ULL << 13, 63 DIRTY_MATEMISSIVE = 1ULL << 14, 64 DIRTY_AMBIENT = 1ULL << 15, 65 DIRTY_MATAMBIENTALPHA = 1ULL << 16, 66 67 DIRTY_SHADERBLEND = 1ULL << 17, // Used only for in-shader blending. 68 69 DIRTY_UVSCALEOFFSET = 1ULL << 18, 70 DIRTY_DEPTHRANGE = 1ULL << 19, 71 72 DIRTY_WORLDMATRIX = 1ULL << 21, 73 DIRTY_VIEWMATRIX = 1ULL << 22, 74 DIRTY_TEXMATRIX = 1ULL << 23, 75 DIRTY_BONEMATRIX0 = 1ULL << 24, // NOTE: These must be under 32 76 DIRTY_BONEMATRIX1 = 1ULL << 25, 77 DIRTY_BONEMATRIX2 = 1ULL << 26, 78 DIRTY_BONEMATRIX3 = 1ULL << 27, 79 DIRTY_BONEMATRIX4 = 1ULL << 28, 80 DIRTY_BONEMATRIX5 = 1ULL << 29, 81 DIRTY_BONEMATRIX6 = 1ULL << 30, 82 DIRTY_BONEMATRIX7 = 1ULL << 31, 83 84 DIRTY_BEZIERSPLINE = 1ULL << 32, 85 DIRTY_TEXCLAMP = 1ULL << 33, 86 DIRTY_CULLRANGE = 1ULL << 34, 87 88 DIRTY_DEPAL = 1ULL << 35, 89 DIRTY_COLORWRITEMASK = 1ULL << 36, 90 91 // space for 4 more uniform dirty flags. Remember to update DIRTY_ALL_UNIFORMS. 92 93 DIRTY_BONE_UNIFORMS = 0xFF000000ULL, 94 95 DIRTY_ALL_UNIFORMS = 0x1FFFFFFFFFULL, 96 DIRTY_ALL_LIGHTS = DIRTY_LIGHT0 | DIRTY_LIGHT1 | DIRTY_LIGHT2 | DIRTY_LIGHT3, 97 98 // Other dirty elements that aren't uniforms! 99 DIRTY_FRAMEBUF = 1ULL << 40, 100 DIRTY_TEXTURE_IMAGE = 1ULL << 41, // Means that the definition of the texture image has changed (address, stride etc), and we need to look up again. 101 DIRTY_TEXTURE_PARAMS = 1ULL << 42, 102 103 // Render State 104 DIRTY_BLEND_STATE = 1ULL << 43, 105 DIRTY_DEPTHSTENCIL_STATE = 1ULL << 44, 106 DIRTY_RASTER_STATE = 1ULL << 45, 107 DIRTY_VIEWPORTSCISSOR_STATE = 1ULL << 46, 108 DIRTY_VERTEXSHADER_STATE = 1ULL << 47, 109 DIRTY_FRAGMENTSHADER_STATE = 1ULL << 48, 110 111 DIRTY_ALL = 0xFFFFFFFFFFFFFFFF 112 }; 113 114 class ShaderManagerCommon { 115 public: ShaderManagerCommon(Draw::DrawContext * draw)116 ShaderManagerCommon(Draw::DrawContext *draw) : draw_(draw) {} ~ShaderManagerCommon()117 virtual ~ShaderManagerCommon() {} 118 119 virtual void DirtyLastShader() = 0; 120 121 protected: 122 Draw::DrawContext *draw_ = nullptr; 123 }; 124 125 enum DoLightComputation { 126 LIGHT_OFF, 127 LIGHT_SHADE, 128 LIGHT_FULL, 129 }; 130 131 // PSP vertex format. 132 enum class PspAttributeLocation { 133 POSITION = 0, 134 TEXCOORD = 1, 135 NORMAL = 2, 136 W1 = 3, 137 W2 = 4, 138 COLOR0 = 5, 139 COLOR1 = 6, 140 141 COUNT 142 }; 143 144 // Pre-fetched attrs and uniforms (used by GL only). 145 enum { 146 ATTR_POSITION = 0, 147 ATTR_TEXCOORD = 1, 148 ATTR_NORMAL = 2, 149 ATTR_W1 = 3, 150 ATTR_W2 = 4, 151 ATTR_COLOR0 = 5, 152 ATTR_COLOR1 = 6, 153 154 ATTR_COUNT, 155 }; 156 157 struct TBuiltInResource; 158 void init_resources(TBuiltInResource &Resources); 159