2015-05-19 06:21:33 +02:00
|
|
|
// Copyright 2015 Citra Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
#include <utility>
|
|
|
|
|
2015-05-19 06:21:33 +02:00
|
|
|
#include "common/common_types.h"
|
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
#include "video_core/renderer_opengl/generated/gl_3_2_core.h"
|
|
|
|
#include "video_core/renderer_opengl/gl_shader_util.h"
|
2015-08-06 04:22:06 +02:00
|
|
|
#include "video_core/renderer_opengl/gl_state.h"
|
2015-05-19 06:21:33 +02:00
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
class OGLTexture : private NonCopyable {
|
2015-05-19 06:21:33 +02:00
|
|
|
public:
|
2015-07-26 11:38:19 +02:00
|
|
|
OGLTexture() = default;
|
|
|
|
OGLTexture(OGLTexture&& o) { std::swap(handle, o.handle); }
|
|
|
|
~OGLTexture() { Release(); }
|
|
|
|
OGLTexture& operator=(OGLTexture&& o) { std::swap(handle, o.handle); return *this; }
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Creates a new internal OpenGL resource and stores the handle
|
2015-07-26 11:38:19 +02:00
|
|
|
void Create() {
|
|
|
|
if (handle != 0) return;
|
|
|
|
glGenTextures(1, &handle);
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Deletes the internal OpenGL resource
|
2015-07-26 11:38:19 +02:00
|
|
|
void Release() {
|
|
|
|
if (handle == 0) return;
|
|
|
|
glDeleteTextures(1, &handle);
|
2015-08-06 04:22:06 +02:00
|
|
|
OpenGLState::ResetTexture(handle);
|
2015-07-26 11:38:19 +02:00
|
|
|
handle = 0;
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
GLuint handle = 0;
|
2015-05-19 06:21:33 +02:00
|
|
|
};
|
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
class OGLShader : private NonCopyable {
|
2015-05-19 06:21:33 +02:00
|
|
|
public:
|
2015-07-26 11:38:19 +02:00
|
|
|
OGLShader() = default;
|
|
|
|
OGLShader(OGLShader&& o) { std::swap(handle, o.handle); }
|
|
|
|
~OGLShader() { Release(); }
|
|
|
|
OGLShader& operator=(OGLShader&& o) { std::swap(handle, o.handle); return *this; }
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Creates a new internal OpenGL resource and stores the handle
|
2015-07-26 11:38:19 +02:00
|
|
|
void Create(const char* vert_shader, const char* frag_shader) {
|
|
|
|
if (handle != 0) return;
|
|
|
|
handle = ShaderUtil::LoadShaders(vert_shader, frag_shader);
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Deletes the internal OpenGL resource
|
2015-07-26 11:38:19 +02:00
|
|
|
void Release() {
|
|
|
|
if (handle == 0) return;
|
|
|
|
glDeleteProgram(handle);
|
2015-08-06 04:22:06 +02:00
|
|
|
OpenGLState::ResetProgram(handle);
|
2015-07-26 11:38:19 +02:00
|
|
|
handle = 0;
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
GLuint handle = 0;
|
2015-05-19 06:21:33 +02:00
|
|
|
};
|
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
class OGLBuffer : private NonCopyable {
|
2015-05-19 06:21:33 +02:00
|
|
|
public:
|
2015-07-26 11:38:19 +02:00
|
|
|
OGLBuffer() = default;
|
|
|
|
OGLBuffer(OGLBuffer&& o) { std::swap(handle, o.handle); }
|
|
|
|
~OGLBuffer() { Release(); }
|
|
|
|
OGLBuffer& operator=(OGLBuffer&& o) { std::swap(handle, o.handle); return *this; }
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Creates a new internal OpenGL resource and stores the handle
|
2015-07-26 11:38:19 +02:00
|
|
|
void Create() {
|
|
|
|
if (handle != 0) return;
|
|
|
|
glGenBuffers(1, &handle);
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Deletes the internal OpenGL resource
|
2015-07-26 11:38:19 +02:00
|
|
|
void Release() {
|
|
|
|
if (handle == 0) return;
|
|
|
|
glDeleteBuffers(1, &handle);
|
2015-08-06 04:22:06 +02:00
|
|
|
OpenGLState::ResetBuffer(handle);
|
2015-07-26 11:38:19 +02:00
|
|
|
handle = 0;
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
GLuint handle = 0;
|
2015-05-19 06:21:33 +02:00
|
|
|
};
|
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
class OGLVertexArray : private NonCopyable {
|
2015-05-19 06:21:33 +02:00
|
|
|
public:
|
2015-07-26 11:38:19 +02:00
|
|
|
OGLVertexArray() = default;
|
|
|
|
OGLVertexArray(OGLVertexArray&& o) { std::swap(handle, o.handle); }
|
|
|
|
~OGLVertexArray() { Release(); }
|
|
|
|
OGLVertexArray& operator=(OGLVertexArray&& o) { std::swap(handle, o.handle); return *this; }
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Creates a new internal OpenGL resource and stores the handle
|
2015-07-26 11:38:19 +02:00
|
|
|
void Create() {
|
|
|
|
if (handle != 0) return;
|
|
|
|
glGenVertexArrays(1, &handle);
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Deletes the internal OpenGL resource
|
2015-07-26 11:38:19 +02:00
|
|
|
void Release() {
|
|
|
|
if (handle == 0) return;
|
|
|
|
glDeleteVertexArrays(1, &handle);
|
2015-08-06 04:22:06 +02:00
|
|
|
OpenGLState::ResetVertexArray(handle);
|
2015-07-26 11:38:19 +02:00
|
|
|
handle = 0;
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
GLuint handle = 0;
|
2015-05-19 06:21:33 +02:00
|
|
|
};
|
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
class OGLFramebuffer : private NonCopyable {
|
2015-05-19 06:21:33 +02:00
|
|
|
public:
|
2015-07-26 11:38:19 +02:00
|
|
|
OGLFramebuffer() = default;
|
|
|
|
OGLFramebuffer(OGLFramebuffer&& o) { std::swap(handle, o.handle); }
|
|
|
|
~OGLFramebuffer() { Release(); }
|
|
|
|
OGLFramebuffer& operator=(OGLFramebuffer&& o) { std::swap(handle, o.handle); return *this; }
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Creates a new internal OpenGL resource and stores the handle
|
2015-07-26 11:38:19 +02:00
|
|
|
void Create() {
|
|
|
|
if (handle != 0) return;
|
|
|
|
glGenFramebuffers(1, &handle);
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
|
|
|
/// Deletes the internal OpenGL resource
|
2015-07-26 11:38:19 +02:00
|
|
|
void Release() {
|
|
|
|
if (handle == 0) return;
|
|
|
|
glDeleteFramebuffers(1, &handle);
|
2015-08-06 04:22:06 +02:00
|
|
|
OpenGLState::ResetFramebuffer(handle);
|
2015-07-26 11:38:19 +02:00
|
|
|
handle = 0;
|
|
|
|
}
|
2015-05-19 06:21:33 +02:00
|
|
|
|
2015-07-26 11:38:19 +02:00
|
|
|
GLuint handle = 0;
|
2015-05-19 06:21:33 +02:00
|
|
|
};
|