2015-10-14 17:45:21 +02:00
|
|
|
// Copyright (c) 2015- PPSSPP Project.
|
|
|
|
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
|
// the Free Software Foundation, version 2.0 or later versions.
|
|
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
|
|
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
|
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
|
|
|
|
|
|
// Official git repository and contact information can be found at
|
|
|
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2017-02-08 18:07:34 +01:00
|
|
|
#include <cstdint>
|
2023-02-25 16:40:52 +01:00
|
|
|
#include <vector>
|
|
|
|
|
#include <string>
|
2017-02-08 18:07:34 +01:00
|
|
|
|
2018-12-23 12:06:29 -08:00
|
|
|
namespace Draw {
|
|
|
|
|
class DrawContext;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-14 17:45:21 +02:00
|
|
|
enum DebugShaderType {
|
|
|
|
|
SHADER_TYPE_VERTEX = 0,
|
|
|
|
|
SHADER_TYPE_FRAGMENT = 1,
|
2015-10-21 23:06:32 +02:00
|
|
|
SHADER_TYPE_GEOMETRY = 2,
|
|
|
|
|
SHADER_TYPE_VERTEXLOADER = 3, // Not really a shader, but might as well re-use this mechanism
|
2015-10-10 16:41:19 +02:00
|
|
|
SHADER_TYPE_PIPELINE = 4, // Vulkan and DX12 combines a bunch of state into pipeline objects. Might as well make them inspectable.
|
2022-08-22 12:28:46 +02:00
|
|
|
SHADER_TYPE_TEXTURE = 5,
|
2017-12-06 16:01:56 +01:00
|
|
|
SHADER_TYPE_SAMPLER = 6, // Not really a shader either. Need to rename this enum...
|
2015-10-14 17:45:21 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum DebugShaderStringType {
|
|
|
|
|
SHADER_STRING_SHORT_DESC = 0,
|
|
|
|
|
SHADER_STRING_SOURCE_CODE = 1,
|
|
|
|
|
SHADER_STRING_STATS = 2,
|
|
|
|
|
};
|
2017-01-23 20:36:02 +01:00
|
|
|
|
|
|
|
|
// Shared between the backends. Not all are necessarily used by each backend, but this lets us share
|
2020-11-08 23:17:06 +01:00
|
|
|
// more code than before. TODO: Can probably cut the number of these down without too much slowdown.
|
2017-01-23 20:36:02 +01:00
|
|
|
enum : uint64_t {
|
|
|
|
|
DIRTY_PROJMATRIX = 1ULL << 0,
|
|
|
|
|
DIRTY_PROJTHROUGHMATRIX = 1ULL << 1,
|
|
|
|
|
DIRTY_FOGCOLOR = 1ULL << 2,
|
2023-05-08 22:01:14 +02:00
|
|
|
DIRTY_FOGCOEF = 1ULL << 3,
|
2017-01-23 20:36:02 +01:00
|
|
|
DIRTY_TEXENV = 1ULL << 4,
|
|
|
|
|
DIRTY_ALPHACOLORREF = 1ULL << 5,
|
|
|
|
|
|
|
|
|
|
DIRTY_STENCILREPLACEVALUE = 1ULL << 6,
|
|
|
|
|
|
|
|
|
|
DIRTY_ALPHACOLORMASK = 1ULL << 7,
|
|
|
|
|
DIRTY_LIGHT0 = 1ULL << 8,
|
|
|
|
|
DIRTY_LIGHT1 = 1ULL << 9,
|
|
|
|
|
DIRTY_LIGHT2 = 1ULL << 10,
|
|
|
|
|
DIRTY_LIGHT3 = 1ULL << 11,
|
|
|
|
|
|
|
|
|
|
DIRTY_MATDIFFUSE = 1ULL << 12,
|
|
|
|
|
DIRTY_MATSPECULAR = 1ULL << 13,
|
|
|
|
|
DIRTY_MATEMISSIVE = 1ULL << 14,
|
|
|
|
|
DIRTY_AMBIENT = 1ULL << 15,
|
|
|
|
|
DIRTY_MATAMBIENTALPHA = 1ULL << 16,
|
|
|
|
|
|
|
|
|
|
DIRTY_SHADERBLEND = 1ULL << 17, // Used only for in-shader blending.
|
|
|
|
|
|
|
|
|
|
DIRTY_UVSCALEOFFSET = 1ULL << 18,
|
|
|
|
|
DIRTY_DEPTHRANGE = 1ULL << 19,
|
|
|
|
|
|
|
|
|
|
DIRTY_WORLDMATRIX = 1ULL << 21,
|
|
|
|
|
DIRTY_VIEWMATRIX = 1ULL << 22,
|
|
|
|
|
DIRTY_TEXMATRIX = 1ULL << 23,
|
2018-04-10 12:22:02 +02:00
|
|
|
DIRTY_BONEMATRIX0 = 1ULL << 24, // NOTE: These must be under 32
|
|
|
|
|
DIRTY_BONEMATRIX1 = 1ULL << 25,
|
|
|
|
|
DIRTY_BONEMATRIX2 = 1ULL << 26,
|
|
|
|
|
DIRTY_BONEMATRIX3 = 1ULL << 27,
|
|
|
|
|
DIRTY_BONEMATRIX4 = 1ULL << 28,
|
|
|
|
|
DIRTY_BONEMATRIX5 = 1ULL << 29,
|
|
|
|
|
DIRTY_BONEMATRIX6 = 1ULL << 30,
|
|
|
|
|
DIRTY_BONEMATRIX7 = 1ULL << 31,
|
2017-01-23 20:36:02 +01:00
|
|
|
|
2017-03-19 19:51:44 -07:00
|
|
|
DIRTY_BEZIERSPLINE = 1ULL << 32,
|
2017-12-07 21:38:02 +01:00
|
|
|
DIRTY_TEXCLAMP = 1ULL << 33,
|
2018-09-16 22:52:43 -07:00
|
|
|
DIRTY_CULLRANGE = 1ULL << 34,
|
2017-12-07 21:38:02 +01:00
|
|
|
|
2018-09-16 22:52:43 -07:00
|
|
|
DIRTY_DEPAL = 1ULL << 35,
|
2020-11-08 23:17:06 +01:00
|
|
|
DIRTY_COLORWRITEMASK = 1ULL << 36,
|
2018-04-13 12:25:57 +02:00
|
|
|
|
2022-07-31 10:43:12 +02:00
|
|
|
DIRTY_MIPBIAS = 1ULL << 37,
|
2022-09-25 13:59:52 +02:00
|
|
|
DIRTY_LIGHT_CONTROL = 1ULL << 38,
|
2023-01-05 17:05:42 +01:00
|
|
|
DIRTY_TEX_ALPHA_MUL = 1ULL << 39,
|
2017-01-23 20:36:02 +01:00
|
|
|
|
2023-07-30 14:42:22 +02:00
|
|
|
// Bits 40-42 are free for new uniforms. Then we're really out and need to start merging.
|
2023-01-10 10:36:04 +01:00
|
|
|
// Don't forget to update DIRTY_ALL_UNIFORMS when you start using them.
|
|
|
|
|
|
2018-04-10 12:22:02 +02:00
|
|
|
DIRTY_BONE_UNIFORMS = 0xFF000000ULL,
|
|
|
|
|
|
2023-01-10 10:36:04 +01:00
|
|
|
DIRTY_ALL_UNIFORMS = 0x0FFFFFFFFFFULL,
|
2017-01-23 21:08:16 +01:00
|
|
|
|
2023-01-10 10:36:04 +01:00
|
|
|
// Other dirty elements that aren't uniforms
|
2023-07-30 14:42:22 +02:00
|
|
|
DIRTY_CULL_PLANES = 1ULL << 43,
|
2023-01-10 10:36:04 +01:00
|
|
|
DIRTY_FRAMEBUF = 1ULL << 44,
|
|
|
|
|
DIRTY_TEXTURE_IMAGE = 1ULL << 45, // Means that the definition of the texture image has changed (address, stride etc), and we need to look up again.
|
|
|
|
|
DIRTY_TEXTURE_PARAMS = 1ULL << 46,
|
2017-01-23 23:25:09 +01:00
|
|
|
|
2017-01-30 11:56:14 +01:00
|
|
|
// Render State
|
2023-01-10 10:36:04 +01:00
|
|
|
DIRTY_BLEND_STATE = 1ULL << 47,
|
|
|
|
|
DIRTY_DEPTHSTENCIL_STATE = 1ULL << 48,
|
|
|
|
|
DIRTY_RASTER_STATE = 1ULL << 49,
|
|
|
|
|
DIRTY_VIEWPORTSCISSOR_STATE = 1ULL << 50,
|
|
|
|
|
DIRTY_VERTEXSHADER_STATE = 1ULL << 51,
|
|
|
|
|
DIRTY_FRAGMENTSHADER_STATE = 1ULL << 52,
|
|
|
|
|
DIRTY_GEOMETRYSHADER_STATE = 1ULL << 53,
|
|
|
|
|
|
|
|
|
|
// Note that the top 8 bits (54-63) cannot be dirtied through the commonCommandTable due to packing of other flags.
|
2017-01-30 11:56:14 +01:00
|
|
|
|
2022-09-22 09:12:20 +02:00
|
|
|
// Everything that's not uniforms. Use this after using thin3d.
|
|
|
|
|
// TODO: Should we also add DIRTY_FRAMEBUF here? It kinda generally takes care of itself.
|
2022-10-01 19:22:16 -07:00
|
|
|
DIRTY_ALL_RENDER_STATE = DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_GEOMETRYSHADER_STATE | DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS,
|
2022-09-22 09:12:20 +02:00
|
|
|
|
2017-01-23 20:36:02 +01:00
|
|
|
DIRTY_ALL = 0xFFFFFFFFFFFFFFFF
|
|
|
|
|
};
|
2017-01-23 20:48:23 +01:00
|
|
|
|
|
|
|
|
class ShaderManagerCommon {
|
|
|
|
|
public:
|
2018-12-23 12:06:29 -08:00
|
|
|
ShaderManagerCommon(Draw::DrawContext *draw) : draw_(draw) {}
|
2017-01-23 20:48:23 +01:00
|
|
|
virtual ~ShaderManagerCommon() {}
|
2017-02-15 18:32:44 +01:00
|
|
|
|
2023-02-25 15:59:35 +01:00
|
|
|
virtual void ClearShaders() = 0;
|
2017-02-15 18:32:44 +01:00
|
|
|
virtual void DirtyLastShader() = 0;
|
2018-12-23 12:06:29 -08:00
|
|
|
|
2023-02-25 15:59:35 +01:00
|
|
|
virtual void DeviceLost() = 0;
|
|
|
|
|
virtual void DeviceRestore(Draw::DrawContext *draw) = 0; // must set draw_ to draw
|
|
|
|
|
|
2023-02-25 16:40:52 +01:00
|
|
|
virtual std::vector<std::string> DebugGetShaderIDs(DebugShaderType type) = 0;
|
|
|
|
|
virtual std::string DebugGetShaderString(std::string id, DebugShaderType type, DebugShaderStringType stringType) = 0;
|
|
|
|
|
|
2018-12-23 12:06:29 -08:00
|
|
|
protected:
|
|
|
|
|
Draw::DrawContext *draw_ = nullptr;
|
2017-02-25 00:25:46 +01:00
|
|
|
};
|
|
|
|
|
|
2020-10-21 23:09:34 +02:00
|
|
|
enum DoLightComputation {
|
|
|
|
|
LIGHT_OFF,
|
|
|
|
|
LIGHT_SHADE,
|
|
|
|
|
LIGHT_FULL,
|
|
|
|
|
};
|
2020-10-21 23:39:34 +02:00
|
|
|
|
2020-10-23 00:44:35 +02:00
|
|
|
// PSP vertex format.
|
|
|
|
|
enum class PspAttributeLocation {
|
|
|
|
|
POSITION = 0,
|
|
|
|
|
TEXCOORD = 1,
|
|
|
|
|
NORMAL = 2,
|
|
|
|
|
W1 = 3,
|
|
|
|
|
W2 = 4,
|
|
|
|
|
COLOR0 = 5,
|
|
|
|
|
COLOR1 = 6,
|
|
|
|
|
|
|
|
|
|
COUNT
|
|
|
|
|
};
|
2020-11-01 13:02:53 +01:00
|
|
|
|
|
|
|
|
// Pre-fetched attrs and uniforms (used by GL only).
|
|
|
|
|
enum {
|
|
|
|
|
ATTR_POSITION = 0,
|
|
|
|
|
ATTR_TEXCOORD = 1,
|
|
|
|
|
ATTR_NORMAL = 2,
|
|
|
|
|
ATTR_W1 = 3,
|
|
|
|
|
ATTR_W2 = 4,
|
|
|
|
|
ATTR_COLOR0 = 5,
|
|
|
|
|
ATTR_COLOR1 = 6,
|
|
|
|
|
|
|
|
|
|
ATTR_COUNT,
|
|
|
|
|
};
|