Draw Manager: OpenGL render support

Works for clay-engine but doesn't draw objects with eevee.
This commit is contained in:
Campbell Barton 2017-05-03 02:50:29 +10:00
parent 2b0f02057f
commit 3f567535da
7 changed files with 87 additions and 1 deletions

View File

@ -41,6 +41,7 @@ struct ViewContext;
struct ViewportEngineData;
struct View3D;
struct rcti;
struct GPUOffScreen;
#include "BLI_sys_types.h" /* for bool */
@ -67,6 +68,10 @@ void DRW_draw_view(const struct bContext *C);
void DRW_draw_render_loop(
struct Depsgraph *graph,
struct View3D *v3d, struct ARegion *ar);
void DRW_draw_render_loop_offscreen(
struct Depsgraph *graph,
struct View3D *v3d, struct ARegion *ar,
struct GPUOffScreen *ofs);
void DRW_draw_select_loop(
struct Depsgraph *graph,
struct View3D *v3d, struct ARegion *ar,

View File

@ -2188,6 +2188,11 @@ void DRW_draw_view(const bContext *C)
DRW_draw_render_loop(graph, v3d, ar);
}
/**
* Used for both regular drawing and off-screen drawing.
*
* \param ofs: When not NULL, use this data to create the viewport.
*/
void DRW_draw_render_loop(
struct Depsgraph *graph,
View3D *v3d, ARegion *ar)
@ -2273,6 +2278,37 @@ void DRW_draw_render_loop(
memset(&DST, 0x0, sizeof(DST));
}
void DRW_draw_render_loop_offscreen(
struct Depsgraph *graph,
View3D *v3d, ARegion *ar, GPUOffScreen *ofs)
{
RegionView3D *rv3d = ar->regiondata;
/* backup */
void *backup_viewport = rv3d->viewport;
{
/* backup (_never_ use rv3d->viewport) */
rv3d->viewport = GPU_viewport_create_from_offscreen(ofs);
}
DST.draw_ctx.evil_C = NULL;
DRW_draw_render_loop(graph, v3d, ar);
/* restore */
{
/* don't free data owned by 'ofs' */
GPU_viewport_clear_from_offscreen(rv3d->viewport);
GPU_viewport_free(rv3d->viewport);
MEM_freeN(rv3d->viewport);
rv3d->viewport = backup_viewport;
}
/* we need to re-bind (annoying!) */
GPU_offscreen_bind(ofs, false);
}
/**
* object mode select-loop, see: ED_view3d_draw_select_loop (legacy drawing).
*/

View File

@ -107,6 +107,10 @@
#include "GPU_select.h"
#include "GPU_matrix.h"
#include "RE_engine.h"
#include "DRW_engine.h"
#include "view3d_intern.h" /* own include */
/* prototypes */
@ -1811,7 +1815,14 @@ void ED_view3d_draw_offscreen(
}
/* main drawing call */
view3d_draw_objects(NULL, scene, v3d, ar, NULL, do_bgpic, true, do_compositing ? fx : NULL);
RenderEngineType *type = RE_engines_find(scene->r.engine);
if (IS_VIEWPORT_LEGACY(v3d) && ((type->flag & RE_USE_LEGACY_PIPELINE) != 0)) {
view3d_draw_objects(NULL, scene, v3d, ar, NULL, do_bgpic, true, do_compositing ? fx : NULL);
}
else {
/* XXX, should take depsgraph as arg */
DRW_draw_render_loop_offscreen(scene->depsgraph, v3d, ar, ofs);
}
/* post process */
if (do_compositing) {

View File

@ -84,6 +84,10 @@ int GPU_offscreen_width(const GPUOffScreen *ofs);
int GPU_offscreen_height(const GPUOffScreen *ofs);
int GPU_offscreen_color_texture(const GPUOffScreen *ofs);
void GPU_offscreen_viewport_data_get(
GPUOffScreen *ofs,
GPUFrameBuffer **r_fb, struct GPUTexture **r_color, struct GPUTexture **r_depth);
#ifdef __cplusplus
}
#endif

View File

@ -88,6 +88,9 @@ void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect);
void GPU_viewport_unbind(GPUViewport *viewport);
void GPU_viewport_free(GPUViewport *viewport);
GPUViewport *GPU_viewport_create_from_offscreen(struct GPUOffScreen *ofs);
void GPU_viewport_clear_from_offscreen(GPUViewport *viewport);
void *GPU_viewport_engine_data_create(GPUViewport *viewport, void *engine_type);
void *GPU_viewport_engine_data_get(GPUViewport *viewport, void *engine_type);
void *GPU_viewport_framebuffer_list_get(GPUViewport *viewport);

View File

@ -682,3 +682,12 @@ int GPU_offscreen_color_texture(const GPUOffScreen *ofs)
return GPU_texture_opengl_bindcode(ofs->color);
}
/* only to be used by viewport code! */
void GPU_offscreen_viewport_data_get(
GPUOffScreen *ofs,
GPUFrameBuffer **r_fb, GPUTexture **r_color, GPUTexture **r_depth)
{
*r_fb = ofs->fb;
*r_color = ofs->color;
*r_depth = ofs->depth;
}

View File

@ -83,6 +83,24 @@ GPUViewport *GPU_viewport_create(void)
return viewport;
}
GPUViewport *GPU_viewport_create_from_offscreen(struct GPUOffScreen *ofs)
{
GPUViewport *viewport = GPU_viewport_create();
GPU_offscreen_viewport_data_get(ofs, &viewport->fbl->default_fb, &viewport->txl->color, &viewport->txl->depth);
viewport->size[0] = GPU_offscreen_width(ofs);
viewport->size[1] = GPU_offscreen_height(ofs);
return viewport;
}
/**
* Clear vars assigned from offscreen, so we don't free data owned by `GPUOffScreen`.
*/
void GPU_viewport_clear_from_offscreen(GPUViewport *viewport)
{
viewport->fbl->default_fb = NULL;
viewport->txl->color = NULL;
viewport->txl->depth = NULL;
}
void *GPU_viewport_engine_data_create(GPUViewport *viewport, void *engine_type)
{
LinkData *ld = MEM_callocN(sizeof(LinkData), "LinkData");