diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 5c7f4ae18..162108301 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -2,7 +2,6 @@ set(SRCS
             renderer_opengl/generated/gl_3_2_core.c
             renderer_opengl/gl_rasterizer.cpp
             renderer_opengl/gl_rasterizer_cache.cpp
-            renderer_opengl/gl_resource_manager.cpp
             renderer_opengl/gl_shader_util.cpp
             renderer_opengl/gl_state.cpp
             renderer_opengl/renderer_opengl.cpp
diff --git a/src/video_core/renderer_opengl/gl_resource_manager.cpp b/src/video_core/renderer_opengl/gl_resource_manager.cpp
deleted file mode 100644
index 8f4ae28a4..000000000
--- a/src/video_core/renderer_opengl/gl_resource_manager.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2015 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "video_core/renderer_opengl/gl_resource_manager.h"
-#include "video_core/renderer_opengl/gl_shader_util.h"
-
-// Textures
-OGLTexture::OGLTexture() : handle(0) {
-}
-
-OGLTexture::~OGLTexture() {
-    Release();
-}
-
-void OGLTexture::Create() {
-    if (handle != 0) {
-        return;
-    }
-
-    glGenTextures(1, &handle);
-}
-
-void OGLTexture::Release() {
-    glDeleteTextures(1, &handle);
-    handle = 0;
-}
-
-// Shaders
-OGLShader::OGLShader() : handle(0) {
-}
-
-OGLShader::~OGLShader() {
-    Release();
-}
-
-void OGLShader::Create(const char* vert_shader, const char* frag_shader) {
-    if (handle != 0) {
-        return;
-    }
-
-    handle = ShaderUtil::LoadShaders(vert_shader, frag_shader);
-}
-
-void OGLShader::Release() {
-    glDeleteProgram(handle);
-    handle = 0;
-}
-
-// Buffer objects
-OGLBuffer::OGLBuffer() : handle(0) {
-}
-
-OGLBuffer::~OGLBuffer() {
-    Release();
-}
-
-void OGLBuffer::Create() {
-    if (handle != 0) {
-        return;
-    }
-
-    glGenBuffers(1, &handle);
-}
-
-void OGLBuffer::Release() {
-    glDeleteBuffers(1, &handle);
-    handle = 0;
-}
-
-// Vertex array objects
-OGLVertexArray::OGLVertexArray() : handle(0) {
-}
-
-OGLVertexArray::~OGLVertexArray() {
-    Release();
-}
-
-void OGLVertexArray::Create() {
-    if (handle != 0) {
-        return;
-    }
-
-    glGenVertexArrays(1, &handle);
-}
-
-void OGLVertexArray::Release() {
-    glDeleteVertexArrays(1, &handle);
-    handle = 0;
-}
-
-// Framebuffers
-OGLFramebuffer::OGLFramebuffer() : handle(0) {
-}
-
-OGLFramebuffer::~OGLFramebuffer() {
-    Release();
-}
-
-void OGLFramebuffer::Create() {
-    if (handle != 0) {
-        return;
-    }
-
-    glGenFramebuffers(1, &handle);
-}
-
-void OGLFramebuffer::Release() {
-    glDeleteFramebuffers(1, &handle);
-    handle = 0;
-}
diff --git a/src/video_core/renderer_opengl/gl_resource_manager.h b/src/video_core/renderer_opengl/gl_resource_manager.h
index 975720d0a..6f9dc012d 100644
--- a/src/video_core/renderer_opengl/gl_resource_manager.h
+++ b/src/video_core/renderer_opengl/gl_resource_manager.h
@@ -4,76 +4,124 @@
 
 #pragma once
 
+#include <utility>
+
 #include "common/common_types.h"
 
-#include "generated/gl_3_2_core.h"
+#include "video_core/renderer_opengl/generated/gl_3_2_core.h"
+#include "video_core/renderer_opengl/gl_shader_util.h"
 
-class OGLTexture : public NonCopyable {
+class OGLTexture : private NonCopyable {
 public:
-    OGLTexture();
-    ~OGLTexture();
+    OGLTexture() = default;
+    OGLTexture(OGLTexture&& o) { std::swap(handle, o.handle); }
+    ~OGLTexture() { Release(); }
+    OGLTexture& operator=(OGLTexture&& o) { std::swap(handle, o.handle); return *this; }
 
     /// Creates a new internal OpenGL resource and stores the handle
-    void Create();
+    void Create() {
+        if (handle != 0) return;
+        glGenTextures(1, &handle);
+    }
 
     /// Deletes the internal OpenGL resource
-    void Release();
+    void Release() {
+        if (handle == 0) return;
+        glDeleteTextures(1, &handle);
+        handle = 0;
+    }
 
-    GLuint handle;
+    GLuint handle = 0;
 };
 
-class OGLShader : public NonCopyable {
+class OGLShader : private NonCopyable {
 public:
-    OGLShader();
-    ~OGLShader();
+    OGLShader() = default;
+    OGLShader(OGLShader&& o) { std::swap(handle, o.handle); }
+    ~OGLShader() { Release(); }
+    OGLShader& operator=(OGLShader&& o) { std::swap(handle, o.handle); return *this; }
 
     /// Creates a new internal OpenGL resource and stores the handle
-    void Create(const char* vert_shader, const char* frag_shader);
+    void Create(const char* vert_shader, const char* frag_shader) {
+        if (handle != 0) return;
+        handle = ShaderUtil::LoadShaders(vert_shader, frag_shader);
+    }
 
     /// Deletes the internal OpenGL resource
-    void Release();
+    void Release() {
+        if (handle == 0) return;
+        glDeleteProgram(handle);
+        handle = 0;
+    }
 
-    GLuint handle;
+    GLuint handle = 0;
 };
 
-class OGLBuffer : public NonCopyable {
+class OGLBuffer : private NonCopyable {
 public:
-    OGLBuffer();
-    ~OGLBuffer();
+    OGLBuffer() = default;
+    OGLBuffer(OGLBuffer&& o) { std::swap(handle, o.handle); }
+    ~OGLBuffer() { Release(); }
+    OGLBuffer& operator=(OGLBuffer&& o) { std::swap(handle, o.handle); return *this; }
 
     /// Creates a new internal OpenGL resource and stores the handle
-    void Create();
+    void Create() {
+        if (handle != 0) return;
+        glGenBuffers(1, &handle);
+    }
 
     /// Deletes the internal OpenGL resource
-    void Release();
+    void Release() {
+        if (handle == 0) return;
+        glDeleteBuffers(1, &handle);
+        handle = 0;
+    }
 
-    GLuint handle;
+    GLuint handle = 0;
 };
 
-class OGLVertexArray : public NonCopyable {
+class OGLVertexArray : private NonCopyable {
 public:
-    OGLVertexArray();
-    ~OGLVertexArray();
+    OGLVertexArray() = default;
+    OGLVertexArray(OGLVertexArray&& o) { std::swap(handle, o.handle); }
+    ~OGLVertexArray() { Release(); }
+    OGLVertexArray& operator=(OGLVertexArray&& o) { std::swap(handle, o.handle); return *this; }
 
     /// Creates a new internal OpenGL resource and stores the handle
-    void Create();
+    void Create() {
+        if (handle != 0) return;
+        glGenVertexArrays(1, &handle);
+    }
 
     /// Deletes the internal OpenGL resource
-    void Release();
+    void Release() {
+        if (handle == 0) return;
+        glDeleteVertexArrays(1, &handle);
+        handle = 0;
+    }
 
-    GLuint handle;
+    GLuint handle = 0;
 };
 
-class OGLFramebuffer : public NonCopyable {
+class OGLFramebuffer : private NonCopyable {
 public:
-    OGLFramebuffer();
-    ~OGLFramebuffer();
+    OGLFramebuffer() = default;
+    OGLFramebuffer(OGLFramebuffer&& o) { std::swap(handle, o.handle); }
+    ~OGLFramebuffer() { Release(); }
+    OGLFramebuffer& operator=(OGLFramebuffer&& o) { std::swap(handle, o.handle); return *this; }
 
     /// Creates a new internal OpenGL resource and stores the handle
-    void Create();
+    void Create() {
+        if (handle != 0) return;
+        glGenFramebuffers(1, &handle);
+    }
 
     /// Deletes the internal OpenGL resource
-    void Release();
+    void Release() {
+        if (handle == 0) return;
+        glDeleteFramebuffers(1, &handle);
+        handle = 0;
+    }
 
-    GLuint handle;
+    GLuint handle = 0;
 };