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