mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-14 01:27:00 +00:00
using glTexStorage2D/glTexSubImage2D instead of glTexImage2D
Minor improvements
This commit is contained in:
parent
c365004776
commit
8e57cf8da8
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user