diff options
| author | Stenzek <stenzek@gmail.com> | 2017-09-08 19:42:56 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2018-02-22 22:02:34 +1000 |
| commit | fec6bb4d5676de8834c90d93127c1459f46f8dcb (patch) | |
| tree | f484dbc96cc5bdc49282a63b973c98e93ec2bfad /Source/Core/VideoBackends/OGL/OGLShader.cpp | |
| parent | 31111ef1432bc5d6d653fbef175e8ca3ac2c152d (diff) | |
VideoBackends: Add AbstractShader and AbstractPipeline classes
Diffstat (limited to 'Source/Core/VideoBackends/OGL/OGLShader.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/OGLShader.cpp | 77 |
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 |
