GPU: Create and use new GPU_texture_read_rect utility.

This commit is contained in:
2019-03-22 12:52:38 -03:00
parent a96ccf20b6
commit e061cb4437
3 changed files with 34 additions and 10 deletions

View File

@@ -2509,16 +2509,8 @@ void DRW_framebuffer_select_id_release(ARegion *ar)
/* Read a block of pixels from the select frame buffer. */
void DRW_framebuffer_select_id_read(const rcti *rect, uint *r_buf)
{
DRW_opengl_context_enable();
GPU_framebuffer_bind(g_select_buffer.framebuffer_select_id);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(rect->xmin, rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
GL_RED_INTEGER, GL_UNSIGNED_INT, r_buf);
GPU_framebuffer_restore();
DRW_opengl_context_disable();
GPU_texture_read_rect(
g_select_buffer.texture_u32, GPU_DATA_UNSIGNED_INT, rect, r_buf);
}
/** \} */

View File

@@ -185,6 +185,9 @@ void GPU_texture_update_sub(
int offset_x, int offset_y, int offset_z, int width, int height, int depth);
void *GPU_texture_read(GPUTexture *tex, eGPUDataFormat gpu_data_format, int miplvl);
void GPU_texture_read_rect(
GPUTexture *tex, eGPUDataFormat gpu_data_format,
const struct rcti *rect, void *r_buf);
void GPU_invalid_tex_init(void);
void GPU_invalid_tex_bind(int mode);

View File

@@ -1266,6 +1266,35 @@ void *GPU_texture_read(GPUTexture *tex, eGPUDataFormat gpu_data_format, int mipl
return buf;
}
void GPU_texture_read_rect(
GPUTexture *tex, eGPUDataFormat gpu_data_format,
const rcti *rect, void *r_buf)
{
gpu_validate_data_format(tex->format, gpu_data_format);
GPUFrameBuffer *cur_fb = GPU_framebuffer_active_get();
GPUFrameBuffer *tmp_fb = GPU_framebuffer_create();
GPU_framebuffer_texture_attach(tmp_fb, tex, 0, 0);
GPU_framebuffer_bind(tmp_fb);
glReadBuffer(GL_COLOR_ATTACHMENT0);
GLenum data_format = gpu_get_gl_dataformat(tex->format, &tex->format_flag);
GLenum data_type = gpu_get_gl_datatype(gpu_data_format);
glReadPixels(rect->xmin, rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
data_format, data_type, r_buf);
if (cur_fb) {
GPU_framebuffer_bind(cur_fb);
}
else {
GPU_framebuffer_restore();
}
GPU_framebuffer_free(tmp_fb);
}
void GPU_texture_update(GPUTexture *tex, eGPUDataFormat data_format, const void *pixels)
{
GPU_texture_update_sub(tex, data_format, pixels, 0, 0, 0, tex->w, tex->h, tex->d);