summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.h
blob: 4c97da20e2d7e435262435ab0d1a1ed61d61e94b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright 2011 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include <tuple>

#include "Common/GL/GLUtil.h"
#include "Common/LinearDiskCache.h"

#include "Core/ConfigManager.h"

#include "VideoCommon/GeometryShaderGen.h"
#include "VideoCommon/PixelShaderGen.h"
#include "VideoCommon/VertexShaderGen.h"

namespace OGL
{
class SHADERUID
{
public:
  VertexShaderUid vuid;
  PixelShaderUid puid;
  GeometryShaderUid guid;

  bool operator<(const SHADERUID& r) const
  {
    return std::tie(puid, vuid, guid) < std::tie(r.puid, r.vuid, r.guid);
  }

  bool operator==(const SHADERUID& r) const
  {
    return std::tie(puid, vuid, guid) == std::tie(r.puid, r.vuid, r.guid);
  }
};

struct SHADER
{
  SHADER() : glprogid(0) {}
  void Destroy()
  {
    glDeleteProgram(glprogid);
    glprogid = 0;
  }
  GLuint glprogid;  // OpenGL program id

  std::string strvprog, strpprog, strgprog;

  void SetProgramVariables();
  void SetProgramBindings();
  void Bind();
};

class ProgramShaderCache
{
public:
  struct PCacheEntry
  {
    SHADER shader;
    bool in_cache;

    void Destroy() { shader.Destroy(); }
  };

  static PCacheEntry GetShaderProgram();
  static SHADER* SetShader(DSTALPHA_MODE dstAlphaMode, u32 primitive_type);
  static void GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, u32 primitive_type);

  static bool CompileShader(SHADER& shader, const std::string& vcode, const std::string& pcode,
                            const std::string& gcode = "");
  static GLuint CompileSingleShader(GLuint type, const std::string& code);
  static void UploadConstants();

  static void Init();
  static void Shutdown();
  static void CreateHeader();

private:
  class ProgramShaderCacheInserter : public LinearDiskCacheReader<SHADERUID, u8>
  {
  public:
    void Read(const SHADERUID& key, const u8* value, u32 value_size) override;
  };

  typedef std::map<SHADERUID, PCacheEntry> PCache;
  static PCache pshaders;
  static PCacheEntry* last_entry;
  static SHADERUID last_uid;

  static u32 s_ubo_buffer_size;
  static s32 s_ubo_align;
};

}  // namespace OGL