summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/OGLShader.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2017-09-08 19:42:56 +1000
committerStenzek <stenzek@gmail.com>2018-02-22 22:02:34 +1000
commitfec6bb4d5676de8834c90d93127c1459f46f8dcb (patch)
treef484dbc96cc5bdc49282a63b973c98e93ec2bfad /Source/Core/VideoBackends/OGL/OGLShader.cpp
parent31111ef1432bc5d6d653fbef175e8ca3ac2c152d (diff)
VideoBackends: Add AbstractShader and AbstractPipeline classes
Diffstat (limited to 'Source/Core/VideoBackends/OGL/OGLShader.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/OGLShader.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/OGL/OGLShader.cpp b/Source/Core/VideoBackends/OGL/OGLShader.cpp
new file mode 100644
index 0000000000..62c17752f8
--- /dev/null
+++ b/Source/Core/VideoBackends/OGL/OGLShader.cpp
@@ -0,0 +1,77 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "VideoBackends/OGL/OGLShader.h"
+#include "VideoBackends/OGL/ProgramShaderCache.h"
+
+namespace OGL
+{
+static GLenum GetGLShaderTypeForStage(ShaderStage stage)
+{
+ switch (stage)
+ {
+ case ShaderStage::Vertex:
+ return GL_VERTEX_SHADER;
+ case ShaderStage::Geometry:
+ return GL_GEOMETRY_SHADER;
+ case ShaderStage::Pixel:
+ return GL_FRAGMENT_SHADER;
+ case ShaderStage::Compute:
+ return GL_COMPUTE_SHADER;
+ default:
+ return 0;
+ }
+}
+
+OGLShader::OGLShader(ShaderStage stage, GLenum gl_type, GLuint shader_id)
+ : AbstractShader(stage), m_type(gl_type), m_id(shader_id)
+{
+}
+
+OGLShader::OGLShader(GLuint compute_program_id)
+ : AbstractShader(ShaderStage::Compute), m_type(GL_COMPUTE_SHADER), m_id(compute_program_id)
+{
+}
+
+OGLShader::~OGLShader()
+{
+ if (m_stage != ShaderStage::Compute)
+ glDeleteShader(m_id);
+ else
+ glDeleteProgram(m_compute_program_id);
+}
+
+bool OGLShader::HasBinary() const
+{
+ // NOTE: GL shaders do not have binaries, programs do.
+ return false;
+}
+
+AbstractShader::BinaryData OGLShader::GetBinary() const
+{
+ return {};
+}
+
+std::unique_ptr<OGLShader> OGLShader::CreateFromSource(ShaderStage stage, const char* source,
+ size_t length)
+{
+ if (stage != ShaderStage::Compute)
+ {
+ GLenum shader_type = GetGLShaderTypeForStage(stage);
+ GLuint shader_id =
+ ProgramShaderCache::CompileSingleShader(shader_type, std::string(source, length));
+ if (!shader_id)
+ return nullptr;
+
+ return std::make_unique<OGLShader>(stage, shader_type, shader_id);
+ }
+
+ // Compute shaders.
+ SHADER prog;
+ if (!ProgramShaderCache::CompileComputeShader(prog, std::string(source, length)))
+ return nullptr;
+ return std::make_unique<OGLShader>(prog.glprogid);
+}
+
+} // namespace OGL