diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp
index 9e126f15e1..6b748f586e 100644
--- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp
+++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp
@@ -389,8 +389,8 @@ void GLGSRender::end()
 		int location;
 		if (m_program->uniforms.has_location("tex" + std::to_string(i), &location))
 		{
-			rsx::gl_texture::bind(m_texture_cache, i, textures[i]);
-			glProgramUniform1i(m_program->id(), location, i);
+			__glcheck rsx::gl_texture::bind(m_texture_cache, i, textures[i]);
+			__glcheck glProgramUniform1i(m_program->id(), location, i);
 		}
 	}
 
@@ -464,9 +464,9 @@ void GLGSRender::end()
 
 			if (!vertex_info.size) // disabled, bind a null sampler
 			{
-				glActiveTexture(GL_TEXTURE0 + index + rsx::limits::textures_count);
-				glBindTexture(GL_TEXTURE_BUFFER, NULL);
-				glProgramUniform1i(m_program->id(), location, index + rsx::limits::textures_count);
+				__glcheck glActiveTexture(GL_TEXTURE0 + index + rsx::limits::textures_count);
+				__glcheck glBindTexture(GL_TEXTURE_BUFFER, NULL);
+				__glcheck glProgramUniform1i(m_program->id(), location, index + rsx::limits::textures_count);
 				continue;
 			}
 
@@ -500,14 +500,13 @@ void GLGSRender::end()
 				dst += element_size;
 			}
 
-			buffer->data(data_size, nullptr);
-			buffer->sub_data(0, data_size, vertex_arrays_data.data());
+			buffer.data(data_size, vertex_arrays_data.data());
 
 			//Attach buffer to texture
-			texture->copy_from(*buffer, gl_type);
+			texture.copy_from(buffer, gl_type);
 
 			//Link texture to uniform
-			m_program->uniforms.texture(location, index + rsx::limits::textures_count, *texture);
+			m_program->uniforms.texture(location, index + rsx::limits::textures_count, texture);
 		}
 	}
 
@@ -577,17 +576,19 @@ void GLGSRender::end()
 				u32 gl_type = to_gl_internal_type(vertex_info.type, vertex_info.size);
 				u32 data_size = element_size * vertex_draw_count;
 
-				auto &buffer = m_gl_attrib_buffers[index].buffer;
-				auto &texture = m_gl_attrib_buffers[index].texture;
+				auto& attrib_pair = m_gl_attrib_buffers[index];
 
-				buffer->data(data_size, nullptr);
-				buffer->sub_data(0, data_size, vertex_array.data());
+				__glcheck 0;
+
+				attrib_pair.buffer.data(data_size, vertex_array.data());
+
+				__glcheck 0;
 
 				//Attach buffer to texture
-				texture->copy_from(*buffer, gl_type);
+				attrib_pair.texture.copy_from(attrib_pair.buffer, gl_type);
 
 				//Link texture to uniform
-				m_program->uniforms.texture(location, index + rsx::limits::textures_count, *texture);
+				m_program->uniforms.texture(location, index + rsx::limits::textures_count, attrib_pair.texture);
 			}
 			else if (register_vertex_info[index].size > 0)
 			{
@@ -603,17 +604,15 @@ void GLGSRender::end()
 					const u32 gl_type = to_gl_internal_type(vertex_info.type, vertex_info.size);
 					const size_t data_size = vertex_data.size();
 
-					auto &buffer = m_gl_attrib_buffers[index].buffer;
-					auto &texture = m_gl_attrib_buffers[index].texture;
+					auto& attrib_pair = m_gl_attrib_buffers[index];
 
-					buffer->data(data_size, nullptr);
-					buffer->sub_data(0, data_size, vertex_data.data());
+					attrib_pair.buffer.data(data_size, vertex_data.data());
 
 					//Attach buffer to texture
-					texture->copy_from(*buffer, gl_type);
+					attrib_pair.texture.copy_from(attrib_pair.buffer, gl_type);
 
 					//Link texture to uniform
-					m_program->uniforms.texture(location, index + rsx::limits::textures_count, *texture);
+					m_program->uniforms.texture(location, index + rsx::limits::textures_count, attrib_pair.texture);
 					break;
 				}
 				default:
@@ -731,16 +730,10 @@ void GLGSRender::on_init_thread()
 	m_vao.array_buffer = m_vbo;
 	m_vao.element_array_buffer = m_ebo;
 
-	for (texture_buffer_pair &attrib_buffer : m_gl_attrib_buffers)
+	for (texture_buffer_pair &pair : m_gl_attrib_buffers)
 	{
-		gl::texture *&tex = attrib_buffer.texture;
-		tex = new gl::texture(gl::texture::target::texture_buffer);
-		tex->create();
-		tex->set_target(gl::texture::target::texture_buffer);
-
-		gl::buffer *&buf = attrib_buffer.buffer;
-		buf = new gl::buffer();
-		buf->create();
+		pair.texture.create(gl::texture::target::texture_buffer);
+		pair.buffer.create();
 	}
 }
 
@@ -783,17 +776,10 @@ void GLGSRender::on_exit()
 	if (m_fragment_constants_buffer)
 		m_fragment_constants_buffer.remove();
 
-	for (texture_buffer_pair &attrib_buffer : m_gl_attrib_buffers)
+	for (texture_buffer_pair &pair : m_gl_attrib_buffers)
 	{
-		gl::texture *&tex = attrib_buffer.texture;
-		tex->remove();
-		delete tex;
-		tex = nullptr;
-
-		gl::buffer *&buf = attrib_buffer.buffer;
-		buf->remove();
-		delete buf;
-		buf = nullptr;
+		pair.buffer.remove();
+		pair.texture.remove();
 	}
 }
 
@@ -1200,7 +1186,7 @@ void GLGSRender::init_buffers(bool skip_reading)
 				info.format.bpp = 2;
 				info.format.flags = gl::texture_flags::swap_bytes;
 				info.format.type = gl::texture::type::ushort;
-				info.format.internal_format = gl::texture::internal_format::depth16;
+				info.format.internal_format = gl::texture::sized_internal_format::depth16;
 				info.format.format = gl::texture::format::depth;
 				break;
 
@@ -1208,7 +1194,7 @@ void GLGSRender::init_buffers(bool skip_reading)
 				info.format.bpp = 4;
 				info.format.flags = gl::texture_flags::swap_bytes;
 				info.format.type = gl::texture::type::uint_24_8;
-				info.format.internal_format = gl::texture::internal_format::depth24_stencil8;
+				info.format.internal_format = gl::texture::sized_internal_format::depth24_stencil8;
 				info.format.format = gl::texture::format::depth_stencil;
 				break;
 
@@ -1337,6 +1323,8 @@ bool GLGSRender::on_access_violation(u32 address, bool is_writing)
 {
 	if (auto region = m_texture_cache.find_region(address))
 	{
+		std::lock_guard<gl::protected_region> lock(*region);
+
 		if (is_writing)
 		{
 			const bool accurate_cache = true;
diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h
index 788af15858..cb512e0fe5 100644
--- a/rpcs3/Emu/RSX/GL/GLGSRender.h
+++ b/rpcs3/Emu/RSX/GL/GLGSRender.h
@@ -10,6 +10,12 @@
 
 #pragma comment(lib, "opengl32.lib")
 
+struct texture_buffer_pair
+{
+	gl::texture texture;
+	gl::buffer buffer;
+};
+
 class GLGSRender : public GSRender
 {
 private:
@@ -20,12 +26,7 @@ private:
 
 	rsx::surface_info m_surface;
 
-	struct texture_buffer_pair
-	{
-		gl::texture *texture;
-		gl::buffer *buffer;
-	}
-	m_gl_attrib_buffers[rsx::limits::vertex_count];
+	texture_buffer_pair m_gl_attrib_buffers[rsx::limits::vertex_count];
 
 	gl::texture_cache m_texture_cache;
 
diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h
index 54c06d4a4b..66fd2f3efe 100644
--- a/rpcs3/Emu/RSX/GL/GLProcTable.h
+++ b/rpcs3/Emu/RSX/GL/GLProcTable.h
@@ -170,6 +170,10 @@ OPENGL_PROC(PFNGLBINDBUFFERBASEPROC, BindBufferBase);
 OPENGL_PROC(PFNGLTEXBUFFERPROC, TexBuffer);
 OPENGL_PROC(PFNGLTEXTUREBUFFERRANGEEXTPROC, TextureBufferRangeEXT);
 
+OPENGL_PROC(PFNGLTEXSTORAGE1DPROC, TexStorage1D);
+OPENGL_PROC(PFNGLTEXSTORAGE2DPROC, TexStorage2D);
+OPENGL_PROC(PFNGLTEXSTORAGE3DPROC, TexStorage3D);
+
 //ARB_Copy_Image
 OPENGL_PROC(PFNGLCOPYIMAGESUBDATAPROC, CopyImageSubData);
 
diff --git a/rpcs3/Emu/RSX/GL/gl_helpers.h b/rpcs3/Emu/RSX/GL/gl_helpers.h
index da436fe139..19b0c67443 100644
--- a/rpcs3/Emu/RSX/GL/gl_helpers.h
+++ b/rpcs3/Emu/RSX/GL/gl_helpers.h
@@ -15,7 +15,7 @@
 
 namespace gl
 {
-#ifdef _DEBUG
+#if 1//def _DEBUG
 	struct __glcheck_impl_t
 	{
 		const char* file;
@@ -777,7 +777,7 @@ namespace gl
 			depth_stencil = GL_DEPTH_STENCIL
 		};
 
-		enum class internal_format
+		enum class internal_format : GLenum
 		{
 			red = GL_RED,
 			r = GL_R,
@@ -802,6 +802,69 @@ namespace gl
 			compressed_rgba_s3tc_dxt5 = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
 		};
 
+		enum class sized_internal_format : GLenum
+		{
+			r8 = GL_R8,
+			r8_snorm = GL_R8_SNORM,
+			r16f = GL_R16F,
+			r32f = GL_R32F,
+			r8ui = GL_R8UI,
+			r8i = GL_R8I,
+			r16ui = GL_R16UI,
+			r16i = GL_R16I,
+			r32ui = GL_R32UI,
+			r32i = GL_R32I,
+			rg8 = GL_RG8,
+			rg8_snorm = GL_RG8_SNORM,
+			rg16f = GL_RG16F,
+			rg32f = GL_RG32F,
+			rg8ui = GL_RG8UI,
+			rg8i = GL_RG8I,
+			rg16ui = GL_RG16UI,
+			rg16i = GL_RG16I,
+			rg32ui = GL_RG32UI,
+			rg32i = GL_RG32I,
+			rgb8 = GL_RGB8,
+			srgb8 = GL_SRGB8,
+			rgb565 = GL_RGB565,
+			rgb8_snorm = GL_RGB8_SNORM,
+			r11f_g11f_b10f = GL_R11F_G11F_B10F,
+			rgb9_e5 = GL_RGB9_E5,
+			rgb16f = GL_RGB16F,
+			rgb32f = GL_RGB32F,
+			rgb8ui = GL_RGB8UI,
+			rgb8i = GL_RGB8I,
+			rgb16ui = GL_RGB16UI,
+			rgb16i = GL_RGB16I,
+			rgb32ui = GL_RGB32UI,
+			rgb32i = GL_RGB32I,
+			rgba8 = GL_RGBA8,
+			srgb8_alpha8 = GL_SRGB8_ALPHA8,
+			rgba8_snorm = GL_RGBA8_SNORM,
+			rgb5_a1 = GL_RGB5_A1,
+			rgba4 = GL_RGBA4,
+			rgb10_a2 = GL_RGB10_A2,
+			rgba16f = GL_RGBA16F,
+			rgba32f = GL_RGBA32F,
+			rgba8ui = GL_RGBA8UI,
+			rgba8i = GL_RGBA8I,
+			rgb10_a2ui = GL_RGB10_A2UI,
+			rgba16ui = GL_RGBA16UI,
+			rgba16i = GL_RGBA16I,
+			rgba32i = GL_RGBA32I,
+			rgba32ui = GL_RGBA32UI,
+
+			stencil8 = GL_STENCIL_INDEX8,
+			depth16 = GL_DEPTH_COMPONENT16,
+			depth24 = GL_DEPTH_COMPONENT24,
+			depth24_stencil8 = GL_DEPTH24_STENCIL8,
+
+			compressed_rgb_s3tc_dxt1 = GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
+			compressed_rgba_s3tc_dxt1 = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
+			compressed_rgba_s3tc_dxt3 = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,
+			compressed_rgba_s3tc_dxt5 = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
+		};
+
 		enum class wrap
 		{
 			repeat = GL_REPEAT,
@@ -877,7 +940,7 @@ namespace gl
 				case target::texture_rectangle: pname = GL_TEXTURE_BINDING_RECTANGLE; break;
 				}
 
-				glGetIntegerv(pname, &m_last_binding);
+				__glcheck glGetIntegerv(pname, &m_last_binding);
 				
 				new_binding.bind();
 				m_target = (GLenum)new_binding.get_target();
@@ -885,7 +948,7 @@ namespace gl
 
 			~save_binding_state() noexcept
 			{
-				glBindTexture(m_target, m_last_binding);
+				__glcheck glBindTexture(m_target, m_last_binding);
 			}
 		};
 
diff --git a/rpcs3/Emu/RSX/GL/gl_texture_cache.cpp b/rpcs3/Emu/RSX/GL/gl_texture_cache.cpp
index 44ffa8632a..5a9e82c9c9 100644
--- a/rpcs3/Emu/RSX/GL/gl_texture_cache.cpp
+++ b/rpcs3/Emu/RSX/GL/gl_texture_cache.cpp
@@ -68,7 +68,7 @@ namespace gl
 			{
 				LOG_WARNING(RSX, "cached_texture at 0x%x: reading compressed texture from host buffer", info->start_address);
 
-				glCompressedTexImage2D((GLenum)info->target, 0,
+				__glcheck glCompressedTexImage2D((GLenum)info->target, 0,
 					(GLenum)info->format.internal_format,
 					info->width, info->height,
 					0,
@@ -84,7 +84,7 @@ namespace gl
 					.swap_bytes((info->format.flags & gl::texture_flags::swap_bytes) != gl::texture_flags::none)
 					.apply();
 
-				glTexImage2D((GLenum)info->target, 0, (GLenum)info->format.internal_format, info->width, info->height, 0,
+				__glcheck glTexSubImage2D((GLenum)info->target, 0, 0, 0, info->width, info->height,
 					(GLenum)info->format.format, (GLenum)info->format.type, vm::base_priv(info->start_address));
 			}
 		}
@@ -228,14 +228,24 @@ namespace gl
 		return cache_access::none;
 	}
 
+	void cached_texture::lock()
+	{
+		m_parent_region->lock();
+	}
+
+	void cached_texture::unlock()
+	{
+		m_parent_region->unlock();
+	}
+
 	void cached_texture::bind(uint index) const
 	{
 		if (index != ~0u)
 		{
-			glActiveTexture(GL_TEXTURE0 + index);
+			__glcheck glActiveTexture(GL_TEXTURE0 + index);
 		}
 
-		glBindTexture((GLenum)info->target, gl_name);
+		__glcheck glBindTexture((GLenum)info->target, gl_name);
 	}
 
 	void cached_texture::create()
@@ -243,9 +253,12 @@ namespace gl
 		assert(!created());
 
 		glGenTextures(1, &gl_name);
-		bind();
-		glTexImage2D((GLenum)info->target, 0, (GLenum)info->format.internal_format, info->width, info->height, 0,
-			(GLenum)info->format.format, (GLenum)info->format.type, nullptr);
+
+		if (!info->compressed_size)
+		{
+			bind();
+			__glcheck glTexStorage2D((GLenum)info->target, 1, (GLenum)info->format.internal_format, info->width, info->height);
+		}
 	}
 
 	void cached_texture::remove()
@@ -385,7 +398,7 @@ namespace gl
 	cached_texture& protected_region::add(const texture_info& info)
 	{
 		LOG_WARNING(RSX, "new texture in cache at 0x%x", info.start_address);
-		auto &result = m_textures.emplace(info, cached_texture{});
+		const auto &result = m_textures.emplace(info, cached_texture{});
 
 		if (!result.second)
 		{
@@ -424,7 +437,17 @@ namespace gl
 		m_textures.clear();
 	}
 
-	cached_texture &texture_cache::entry(texture_info &info, cache_buffers sync)
+	void protected_region::lock()
+	{
+		m_mtx.lock();
+	}
+
+	void protected_region::unlock()
+	{
+		m_mtx.unlock();
+	}
+
+	cached_texture &texture_cache::entry(const texture_info &info, cache_buffers sync)
 	{
 		u32 aligned_address = info.start_address & ~(vm::page_size - 1);
 		u32 aligned_size = align(info.size(), vm::page_size);
diff --git a/rpcs3/Emu/RSX/GL/gl_texture_cache.h b/rpcs3/Emu/RSX/GL/gl_texture_cache.h
index 6eba96dc1a..bebfbf4bac 100644
--- a/rpcs3/Emu/RSX/GL/gl_texture_cache.h
+++ b/rpcs3/Emu/RSX/GL/gl_texture_cache.h
@@ -46,7 +46,7 @@ namespace gl
 	{
 		u8 bpp;
 		std::array<GLint, 4> remap;
-		texture::internal_format internal_format;
+		texture::sized_internal_format internal_format;
 		texture::format format;
 		texture::type type;
 		texture_flags flags;
@@ -104,6 +104,9 @@ namespace gl
 
 		cache_access requires_protection() const;
 
+		void lock();
+		void unlock();
+
 	protected:
 		void create();
 		void remove();
@@ -121,6 +124,7 @@ namespace gl
 		std::unordered_map<texture_info, cached_texture, fnv_1a_hasher, bitwise_equals> m_textures;
 
 		u32 m_current_protection = 0;
+		std::mutex m_mtx;
 
 	public:
 		u32 size() const
@@ -142,6 +146,9 @@ namespace gl
 		cached_texture& add(const texture_info& info);
 
 		void clear();
+
+		void lock();
+		void unlock();
 	};
 
 	class texture_cache
@@ -149,7 +156,7 @@ namespace gl
 		std::map<u32, protected_region> m_protected_regions;
 
 	public:
-		cached_texture &entry(texture_info &info, cache_buffers sync = cache_buffers::none);
+		cached_texture &entry(const texture_info &info, cache_buffers sync = cache_buffers::none);
 		protected_region *find_region(u32 address);
 		std::vector<protected_region*> find_regions(u32 address, u32 size);
 		void update_protection();
diff --git a/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp b/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp
index 53c0684cb2..1b6f2d8487 100644
--- a/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp
+++ b/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp
@@ -9,7 +9,7 @@
 #include "gl_texture_cache.h"
 
 const std::array<GLint, 4> default_remap{ GL_ALPHA, GL_RED, GL_GREEN, GL_BLUE };
-const std::array<GLint, 4> remap_B8{ GL_BLUE, GL_BLUE, GL_BLUE, GL_BLUE };
+const std::array<GLint, 4> remap_B8{ GL_RED, GL_RED, GL_RED, GL_RED };
 const std::array<GLint, 4> remap_G8B8{ GL_RED, GL_GREEN, GL_RED, GL_GREEN };
 const std::array<GLint, 4> remap_R6G5B5{ GL_ALPHA, GL_GREEN, GL_RED, GL_BLUE };
 const std::array<GLint, 4> remap_X16{ GL_RED, GL_ONE, GL_RED, GL_ONE };
@@ -22,26 +22,26 @@ const std::array<GLint, 4> remap_Y16_X16_FLOAT{ GL_RED, GL_GREEN, GL_RED, GL_GRE
 
 const std::unordered_map<u32, gl::texture_format> textures_fromats
 {
-	{ CELL_GCM_TEXTURE_B8,{ 1, remap_B8, gl::texture::internal_format::rgba, gl::texture::format::blue, gl::texture::type::ubyte, gl::texture_flags::none } },
-	{ CELL_GCM_TEXTURE_A1R5G5B5,{ 2, default_remap, gl::texture::internal_format::rgba, gl::texture::format::bgra, gl::texture::type::ushort_5_5_5_1, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_A4R4G4B4,{ 2, default_remap, gl::texture::internal_format::rgba, gl::texture::format::bgra, gl::texture::type::ushort_4_4_4_4, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_R5G6B5,{ 2, default_remap, gl::texture::internal_format::rgb, gl::texture::format::bgr, gl::texture::type::ushort_5_6_5, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_A8R8G8B8,{ 4, default_remap, gl::texture::internal_format::rgba, gl::texture::format::bgra, gl::texture::type::uint_8_8_8_8, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_G8B8,{ 2, remap_G8B8, gl::texture::internal_format::rgba, gl::texture::format::rg, gl::texture::type::ubyte, gl::texture_flags::allow_remap } },
-	{ CELL_GCM_TEXTURE_R6G5B5,{ 2, remap_R6G5B5, gl::texture::internal_format::rgba, gl::texture::format::bgr, gl::texture::type::ushort_5_6_5, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_DEPTH24_D8,{ 4, default_remap, gl::texture::internal_format::depth24, gl::texture::format::depth, gl::texture::type::uint_8_8_8_8_rev, gl::texture_flags::allow_remap } },
-	{ CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT,{ 4, default_remap, gl::texture::internal_format::depth24, gl::texture::format::depth, gl::texture::type::f32, gl::texture_flags::allow_remap } },
-	{ CELL_GCM_TEXTURE_DEPTH16,{ 2, default_remap, gl::texture::internal_format::depth16, gl::texture::format::depth, gl::texture::type::ushort, gl::texture_flags::allow_remap } },
-	{ CELL_GCM_TEXTURE_DEPTH16_FLOAT,{ 2, default_remap, gl::texture::internal_format::depth16, gl::texture::format::depth, gl::texture::type::f32, gl::texture_flags::allow_remap } },
-	{ CELL_GCM_TEXTURE_X16,{ 2, remap_X16, gl::texture::internal_format::rgba, gl::texture::format::red, gl::texture::type::ushort, gl::texture_flags::swap_bytes } },
-	{ CELL_GCM_TEXTURE_Y16_X16,{ 4, remap_Y16_X16, gl::texture::internal_format::rgba, gl::texture::format::rg, gl::texture::type::ushort, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
-	{ CELL_GCM_TEXTURE_R5G5B5A1,{ 2, default_remap, gl::texture::internal_format::rgba, gl::texture::format::rgba, gl::texture::type::ushort_5_5_5_1, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT,{ 8, default_remap, gl::texture::internal_format::rgba, gl::texture::format::rgba, gl::texture::type::f16, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
-	{ CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT,{ 16, default_remap, gl::texture::internal_format::rgba, gl::texture::format::rgba, gl::texture::type::f32, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
-	{ CELL_GCM_TEXTURE_X32_FLOAT,{ 4, remap_X32_FLOAT, gl::texture::internal_format::rgba, gl::texture::format::red, gl::texture::type::f32, gl::texture_flags::swap_bytes } },
-	{ CELL_GCM_TEXTURE_D1R5G5B5,{ 2, remap_D1R5G5B5, gl::texture::internal_format::rgba, gl::texture::format::bgra, gl::texture::type::ushort_5_5_5_1, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_D8R8G8B8,{ 4, remap_D8R8G8B8, gl::texture::internal_format::rgba, gl::texture::format::bgra, gl::texture::type::uint_8_8_8_8, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
-	{ CELL_GCM_TEXTURE_Y16_X16_FLOAT,{ 4, remap_Y16_X16_FLOAT, gl::texture::internal_format::rgba, gl::texture::format::rg, gl::texture::type::f16, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
+	{ CELL_GCM_TEXTURE_B8,{ 1, remap_B8, gl::texture::sized_internal_format::r8, gl::texture::format::red, gl::texture::type::ubyte, gl::texture_flags::none } },
+	{ CELL_GCM_TEXTURE_A1R5G5B5,{ 2, default_remap, gl::texture::sized_internal_format::rgb5_a1, gl::texture::format::bgra, gl::texture::type::ushort_5_5_5_1, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_A4R4G4B4,{ 2, default_remap, gl::texture::sized_internal_format::rgba4, gl::texture::format::bgra, gl::texture::type::ushort_4_4_4_4, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_R5G6B5,{ 2, default_remap, gl::texture::sized_internal_format::rgb565, gl::texture::format::bgr, gl::texture::type::ushort_5_6_5, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_A8R8G8B8,{ 4, default_remap, gl::texture::sized_internal_format::rgba8, gl::texture::format::bgra, gl::texture::type::uint_8_8_8_8, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_G8B8,{ 2, remap_G8B8, gl::texture::sized_internal_format::rg8, gl::texture::format::rg, gl::texture::type::ubyte, gl::texture_flags::allow_remap } },
+	{ CELL_GCM_TEXTURE_R6G5B5,{ 2, remap_R6G5B5, gl::texture::sized_internal_format::rgb565, gl::texture::format::bgr, gl::texture::type::ushort_5_6_5, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_DEPTH24_D8,{ 4, default_remap, gl::texture::sized_internal_format::depth24, gl::texture::format::depth, gl::texture::type::uint_8_8_8_8_rev, gl::texture_flags::allow_remap } },
+	{ CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT,{ 4, default_remap, gl::texture::sized_internal_format::depth24, gl::texture::format::depth, gl::texture::type::f32, gl::texture_flags::allow_remap } },
+	{ CELL_GCM_TEXTURE_DEPTH16,{ 2, default_remap, gl::texture::sized_internal_format::depth16, gl::texture::format::depth, gl::texture::type::ushort, gl::texture_flags::allow_remap } },
+	{ CELL_GCM_TEXTURE_DEPTH16_FLOAT,{ 2, default_remap, gl::texture::sized_internal_format::depth16, gl::texture::format::depth, gl::texture::type::f32, gl::texture_flags::allow_remap } },
+	{ CELL_GCM_TEXTURE_X16,{ 2, remap_X16, gl::texture::sized_internal_format::r16ui, gl::texture::format::red, gl::texture::type::ushort, gl::texture_flags::swap_bytes } },
+	{ CELL_GCM_TEXTURE_Y16_X16,{ 4, remap_Y16_X16, gl::texture::sized_internal_format::rg16ui, gl::texture::format::rg, gl::texture::type::ushort, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
+	{ CELL_GCM_TEXTURE_R5G5B5A1,{ 2, default_remap, gl::texture::sized_internal_format::rgb5_a1, gl::texture::format::rgba, gl::texture::type::ushort_5_5_5_1, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT,{ 8, default_remap, gl::texture::sized_internal_format::rgba16f, gl::texture::format::rgba, gl::texture::type::f16, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
+	{ CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT,{ 16, default_remap, gl::texture::sized_internal_format::rgba32f, gl::texture::format::rgba, gl::texture::type::f32, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
+	{ CELL_GCM_TEXTURE_X32_FLOAT,{ 4, remap_X32_FLOAT, gl::texture::sized_internal_format::r32f, gl::texture::format::red, gl::texture::type::f32, gl::texture_flags::swap_bytes } },
+	{ CELL_GCM_TEXTURE_D1R5G5B5,{ 2, remap_D1R5G5B5, gl::texture::sized_internal_format::rgb5_a1, gl::texture::format::bgra, gl::texture::type::ushort_5_5_5_1, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_D8R8G8B8,{ 4, remap_D8R8G8B8, gl::texture::sized_internal_format::rgba8, gl::texture::format::bgra, gl::texture::type::uint_8_8_8_8, gl::texture_flags::allow_remap | gl::texture_flags::allow_swizzle } },
+	{ CELL_GCM_TEXTURE_Y16_X16_FLOAT,{ 4, remap_Y16_X16_FLOAT, gl::texture::sized_internal_format::rg16f, gl::texture::format::rg, gl::texture::type::f16, gl::texture_flags::allow_remap | gl::texture_flags::swap_bytes } },
 };
 
 namespace gl
@@ -177,17 +177,17 @@ void rsx::gl_texture::bind(gl::texture_cache& cache, int index, rsx::texture& te
 		{
 		case CELL_GCM_TEXTURE_COMPRESSED_DXT1: // Compressed 4x4 pixels into 8 bytes
 			info.compressed_size = ((info.width + 3) / 4) * ((info.height + 3) / 4) * 8;
-			info.format.internal_format = gl::texture::internal_format::compressed_rgba_s3tc_dxt1;
+			info.format.internal_format = gl::texture::sized_internal_format::compressed_rgba_s3tc_dxt1;
 			break;
 
 		case CELL_GCM_TEXTURE_COMPRESSED_DXT23: // Compressed 4x4 pixels into 16 bytes
 			info.compressed_size = ((info.width + 3) / 4) * ((info.height + 3) / 4) * 16;
-			info.format.internal_format = gl::texture::internal_format::compressed_rgba_s3tc_dxt3;
+			info.format.internal_format = gl::texture::sized_internal_format::compressed_rgba_s3tc_dxt3;
 			break;
 
 		case CELL_GCM_TEXTURE_COMPRESSED_DXT45: // Compressed 4x4 pixels into 16 bytes
 			info.compressed_size = ((info.width + 3) / 4) * ((info.height + 3) / 4) * 16;
-			info.format.internal_format = gl::texture::internal_format::compressed_rgba_s3tc_dxt5;
+			info.format.internal_format = gl::texture::sized_internal_format::compressed_rgba_s3tc_dxt5;
 			break;
 
 		default:
@@ -218,10 +218,10 @@ void rsx::gl_texture::bind(gl::texture_cache& cache, int index, rsx::texture& te
 		remap = info.format.remap.data();
 	}
 
-	cache.entry(info, gl::cache_buffers::local).bind(index);
+	__glcheck cache.entry(info, gl::cache_buffers::local).bind(index);
 
-	glTexParameteri((GLenum)target, GL_TEXTURE_MAX_LEVEL, tex.mipmap() - 1);
-	glTexParameteri((GLenum)target, GL_GENERATE_MIPMAP, tex.mipmap() > 1);
+	__glcheck glTexParameteri((GLenum)target, GL_TEXTURE_MAX_LEVEL, tex.mipmap() - 1);
+	__glcheck glTexParameteri((GLenum)target, GL_GENERATE_MIPMAP, tex.mipmap() > 1);
 
 	if ((info.format.flags & gl::texture_flags::allow_remap) != gl::texture_flags::none)
 	{
@@ -256,5 +256,7 @@ void rsx::gl_texture::bind(gl::texture_cache& cache, int index, rsx::texture& te
 	glTexParameteri((GLenum)target, GL_TEXTURE_MIN_FILTER, gl_tex_min_filter[tex.min_filter()]);
 	glTexParameteri((GLenum)target, GL_TEXTURE_MAG_FILTER, gl_tex_mag_filter[tex.mag_filter()]);
 	glTexParameterf((GLenum)target, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_aniso(tex.max_aniso()));
+
+	__glcheck 0;
 }