Move readback format mapping to renderer gl
This commit is contained in:
59
src/rtt.cpp
59
src/rtt.cpp
@@ -358,10 +358,18 @@ uint8_t* RTT::readTextureData(uint8_t* buffer) const noexcept
|
||||
buffer = createBuffer();
|
||||
App::I->render_task([&]
|
||||
{
|
||||
const auto readback = pp::renderer::gl::rgba8_readback_format();
|
||||
GLint old;
|
||||
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &old);
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboID);
|
||||
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
|
||||
glReadPixels(
|
||||
0,
|
||||
0,
|
||||
w,
|
||||
h,
|
||||
static_cast<GLenum>(readback.pixel_format),
|
||||
static_cast<GLenum>(readback.component_type),
|
||||
buffer);
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, old);
|
||||
});
|
||||
return buffer;
|
||||
@@ -375,10 +383,18 @@ float* RTT::readTextureDataFloat(float* buffer) const noexcept
|
||||
buffer = createBufferFloat();
|
||||
App::I->render_task([&]
|
||||
{
|
||||
const auto readback = pp::renderer::gl::rgba32f_readback_format();
|
||||
GLint old;
|
||||
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &old);
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboID);
|
||||
glReadPixels(0, 0, w, h, GL_RGBA, GL_FLOAT, buffer);
|
||||
glReadPixels(
|
||||
0,
|
||||
0,
|
||||
w,
|
||||
h,
|
||||
static_cast<GLenum>(readback.pixel_format),
|
||||
static_cast<GLenum>(readback.component_type),
|
||||
buffer);
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, old);
|
||||
});
|
||||
return buffer;
|
||||
@@ -386,12 +402,21 @@ float* RTT::readTextureDataFloat(float* buffer) const noexcept
|
||||
|
||||
uint8_t* RTT::createBuffer() const noexcept
|
||||
{
|
||||
return new uint8_t[w * h * 4];
|
||||
const auto readback = pp::renderer::gl::rgba8_readback_format();
|
||||
return new uint8_t[pp::renderer::gl::readback_byte_count(
|
||||
readback,
|
||||
static_cast<std::uint32_t>(w),
|
||||
static_cast<std::uint32_t>(h))];
|
||||
}
|
||||
|
||||
float * RTT::createBufferFloat() const noexcept
|
||||
{
|
||||
return new float[w * h * 4];
|
||||
const auto readback = pp::renderer::gl::rgba32f_readback_format();
|
||||
return new float[pp::renderer::gl::readback_byte_count(
|
||||
readback,
|
||||
static_cast<std::uint32_t>(w),
|
||||
static_cast<std::uint32_t>(h))
|
||||
/ sizeof(float)];
|
||||
}
|
||||
|
||||
void RTT::bindTexture()
|
||||
@@ -467,11 +492,26 @@ bool PBO::create(RTT& rtt) noexcept
|
||||
App::I->render_task([this, &rtt] {
|
||||
width = rtt.getWidth();
|
||||
height = rtt.getHeight();
|
||||
const auto readback = pp::renderer::gl::rgba8_readback_format();
|
||||
rtt.bindFramebuffer();
|
||||
glGenBuffers(1, &buffer_id);
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer_id);
|
||||
glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 4, 0, GL_STREAM_READ);
|
||||
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||
glBufferData(
|
||||
GL_PIXEL_PACK_BUFFER,
|
||||
static_cast<GLsizeiptr>(pp::renderer::gl::readback_byte_count(
|
||||
readback,
|
||||
static_cast<std::uint32_t>(width),
|
||||
static_cast<std::uint32_t>(height))),
|
||||
0,
|
||||
GL_STREAM_READ);
|
||||
glReadPixels(
|
||||
0,
|
||||
0,
|
||||
width,
|
||||
height,
|
||||
static_cast<GLenum>(readback.pixel_format),
|
||||
static_cast<GLenum>(readback.component_type),
|
||||
0);
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||
rtt.unbindFramebuffer();
|
||||
});
|
||||
@@ -513,9 +553,14 @@ void PBO::unbind() noexcept
|
||||
glm::uint8_t* PBO::map() noexcept
|
||||
{
|
||||
App::I->render_task([this] {
|
||||
const auto readback = pp::renderer::gl::rgba8_readback_format();
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer_id);
|
||||
mapped_ptr = (GLubyte*)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0,
|
||||
width * height * 4, GL_MAP_READ_BIT);
|
||||
static_cast<GLsizeiptr>(pp::renderer::gl::readback_byte_count(
|
||||
readback,
|
||||
static_cast<std::uint32_t>(width),
|
||||
static_cast<std::uint32_t>(height))),
|
||||
GL_MAP_READ_BIT);
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||
});
|
||||
return mapped_ptr;
|
||||
|
||||
Reference in New Issue
Block a user