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; }