GPU: Add API to access render frame buffer

Currently unused, but allows areas outside of DRW to render to the
color render and depth texture.

The primary user of this new API will be Sequencer preview to draw
HDR images.

Ref #138094

Pull Request: https://projects.blender.org/blender/blender/pulls/138306
This commit is contained in:
Sergey Sharybin
2025-05-02 10:38:28 +02:00
committed by Sergey Sharybin
parent 180770fe3f
commit a345c3db64
2 changed files with 20 additions and 2 deletions

View File

@@ -84,6 +84,7 @@ GPUTexture *GPU_viewport_overlay_texture(GPUViewport *viewport, int view);
GPUTexture *GPU_viewport_depth_texture(GPUViewport *viewport);
/**
* Overlay frame-buffer for drawing outside of DRW module.
* Color render and overlay frame-buffers for drawing outside of DRW module.
*/
GPUFrameBuffer *GPU_viewport_framebuffer_render_get(GPUViewport *viewport);
GPUFrameBuffer *GPU_viewport_framebuffer_overlay_get(GPUViewport *viewport);

View File

@@ -66,7 +66,12 @@ struct GPUViewport {
GPUTexture *depth_tx;
/** Compositing framebuffer for stereo viewport. */
GPUFrameBuffer *stereo_comp_fb;
/** Overlay framebuffer for drawing outside of DRW module. */
/** Color render and overlay frame-buffers for drawing outside of DRW module.
* The render framebuffer is expected to be in the linear space and viewport will perform color
* management on it to bring it to the display space.
* The overlay frame-buffer is expected to be in the display space and viewport does not do any
* color management on it. */
GPUFrameBuffer *render_fb;
GPUFrameBuffer *overlay_fb;
/* Color management. */
@@ -178,6 +183,7 @@ static void gpu_viewport_textures_create(GPUViewport *viewport)
static void gpu_viewport_textures_free(GPUViewport *viewport)
{
GPU_FRAMEBUFFER_FREE_SAFE(viewport->stereo_comp_fb);
GPU_FRAMEBUFFER_FREE_SAFE(viewport->render_fb);
GPU_FRAMEBUFFER_FREE_SAFE(viewport->overlay_fb);
for (int i = 0; i < 2; i++) {
@@ -591,6 +597,17 @@ GPUTexture *GPU_viewport_depth_texture(GPUViewport *viewport)
return viewport->depth_tx;
}
GPUFrameBuffer *GPU_viewport_framebuffer_render_get(GPUViewport *viewport)
{
GPU_framebuffer_ensure_config(
&viewport->render_fb,
{
GPU_ATTACHMENT_TEXTURE(viewport->depth_tx),
GPU_ATTACHMENT_TEXTURE(viewport->color_render_tx[viewport->active_view]),
});
return viewport->render_fb;
}
GPUFrameBuffer *GPU_viewport_framebuffer_overlay_get(GPUViewport *viewport)
{
GPU_framebuffer_ensure_config(