Changeset View
Changeset View
Standalone View
Standalone View
source/blender/windowmanager/intern/wm_draw.c
| Show First 20 Lines • Show All 327 Lines • ▼ Show 20 Lines | |||||
| * window draw buffer. This helps with fast redrawing if only some regions | * window draw buffer. This helps with fast redrawing if only some regions | ||||
| * change. It also means we can share a single context for multiple windows, | * change. It also means we can share a single context for multiple windows, | ||||
| * so that for example VAOs can be shared between windows. */ | * so that for example VAOs can be shared between windows. */ | ||||
| static void wm_draw_region_buffer_free(ARegion *region) | static void wm_draw_region_buffer_free(ARegion *region) | ||||
| { | { | ||||
| if (region->draw_buffer) { | if (region->draw_buffer) { | ||||
| for (int view = 0; view < 2; view++) { | for (int view = 0; view < 2; view++) { | ||||
| if (region->draw_buffer->offscreen[view]) { | |||||
| GPU_offscreen_free(region->draw_buffer->offscreen[view]); | |||||
| } | |||||
| if (region->draw_buffer->viewport[view]) { | if (region->draw_buffer->viewport[view]) { | ||||
| GPU_viewport_free(region->draw_buffer->viewport[view]); | GPU_viewport_free(region->draw_buffer->viewport[view]); | ||||
| } | } | ||||
| } | } | ||||
| if (region->draw_buffer->offscreen) { | |||||
| GPU_offscreen_free(region->draw_buffer->offscreen); | |||||
| } | |||||
| MEM_freeN(region->draw_buffer); | MEM_freeN(region->draw_buffer); | ||||
| region->draw_buffer = NULL; | region->draw_buffer = NULL; | ||||
| } | } | ||||
| } | } | ||||
| static void wm_draw_offscreen_texture_parameters(GPUOffScreen *offscreen) | static void wm_draw_offscreen_texture_parameters(GPUOffScreen *offscreen) | ||||
| { | { | ||||
| Show All 18 Lines | |||||
| { | { | ||||
| if (region->draw_buffer) { | if (region->draw_buffer) { | ||||
| if (region->draw_buffer->stereo != stereo) { | if (region->draw_buffer->stereo != stereo) { | ||||
| /* Free draw buffer on stereo changes. */ | /* Free draw buffer on stereo changes. */ | ||||
| wm_draw_region_buffer_free(region); | wm_draw_region_buffer_free(region); | ||||
| } | } | ||||
| else { | else { | ||||
| /* Free offscreen buffer on size changes. Viewport auto resizes. */ | /* Free offscreen buffer on size changes. Viewport auto resizes. */ | ||||
| GPUOffScreen *offscreen = region->draw_buffer->offscreen[0]; | GPUOffScreen *offscreen = region->draw_buffer->offscreen; | ||||
| if (offscreen && (GPU_offscreen_width(offscreen) != region->winx || | if (offscreen && (GPU_offscreen_width(offscreen) != region->winx || | ||||
| GPU_offscreen_height(offscreen) != region->winy)) { | GPU_offscreen_height(offscreen) != region->winy)) { | ||||
| wm_draw_region_buffer_free(region); | wm_draw_region_buffer_free(region); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (!region->draw_buffer) { | if (!region->draw_buffer) { | ||||
| Show All 11 Lines | else { | ||||
| GPUOffScreen *offscreen = GPU_offscreen_create( | GPUOffScreen *offscreen = GPU_offscreen_create( | ||||
| region->winx, region->winy, 0, false, false, NULL); | region->winx, region->winy, 0, false, false, NULL); | ||||
| if (!offscreen) { | if (!offscreen) { | ||||
| return; | return; | ||||
| } | } | ||||
| wm_draw_offscreen_texture_parameters(offscreen); | wm_draw_offscreen_texture_parameters(offscreen); | ||||
| GPUOffScreen *offscreen_right = NULL; | |||||
| if (stereo) { | |||||
| offscreen_right = GPU_offscreen_create(region->winx, region->winy, 0, false, false, NULL); | |||||
| if (!offscreen_right) { | |||||
| GPU_offscreen_free(offscreen); | |||||
| return; | |||||
| } | |||||
| wm_draw_offscreen_texture_parameters(offscreen_right); | |||||
| } | |||||
| region->draw_buffer = MEM_callocN(sizeof(wmDrawBuffer), "wmDrawBuffer"); | region->draw_buffer = MEM_callocN(sizeof(wmDrawBuffer), "wmDrawBuffer"); | ||||
| region->draw_buffer->offscreen[0] = offscreen; | region->draw_buffer->offscreen = offscreen; | ||||
| region->draw_buffer->offscreen[1] = offscreen_right; | |||||
| } | } | ||||
| region->draw_buffer->bound_view = -1; | region->draw_buffer->bound_view = -1; | ||||
| region->draw_buffer->stereo = stereo; | region->draw_buffer->stereo = stereo; | ||||
| } | } | ||||
| } | } | ||||
| static void wm_draw_region_bind(ARegion *region, int view) | static void wm_draw_region_bind(ARegion *region, int view) | ||||
| { | { | ||||
| if (!region->draw_buffer) { | if (!region->draw_buffer) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (region->draw_buffer->viewport[view]) { | if (region->draw_buffer->viewport[view]) { | ||||
| GPU_viewport_bind(region->draw_buffer->viewport[view], ®ion->winrct); | GPU_viewport_bind(region->draw_buffer->viewport[view], ®ion->winrct); | ||||
| } | } | ||||
| else { | else { | ||||
| GPU_offscreen_bind(region->draw_buffer->offscreen[view], false); | GPU_offscreen_bind(region->draw_buffer->offscreen, false); | ||||
| /* For now scissor is expected by region drawing, we could disable it | /* For now scissor is expected by region drawing, we could disable it | ||||
| * and do the enable/disable in the specific cases that setup scissor. */ | * and do the enable/disable in the specific cases that setup scissor. */ | ||||
| glEnable(GL_SCISSOR_TEST); | glEnable(GL_SCISSOR_TEST); | ||||
| glScissor(0, 0, region->winx, region->winy); | glScissor(0, 0, region->winx, region->winy); | ||||
| } | } | ||||
| region->draw_buffer->bound_view = view; | region->draw_buffer->bound_view = view; | ||||
| } | } | ||||
| static void wm_draw_region_unbind(ARegion *region, int view) | static void wm_draw_region_unbind(ARegion *region, int view) | ||||
| { | { | ||||
| if (!region->draw_buffer) { | if (!region->draw_buffer) { | ||||
| return; | return; | ||||
| } | } | ||||
| region->draw_buffer->bound_view = -1; | region->draw_buffer->bound_view = -1; | ||||
| if (region->draw_buffer->viewport[view]) { | if (region->draw_buffer->viewport[view]) { | ||||
| GPU_viewport_unbind(region->draw_buffer->viewport[view]); | GPU_viewport_unbind(region->draw_buffer->viewport[view]); | ||||
| } | } | ||||
| else { | else { | ||||
| glDisable(GL_SCISSOR_TEST); | glDisable(GL_SCISSOR_TEST); | ||||
| GPU_offscreen_unbind(region->draw_buffer->offscreen[view], false); | GPU_offscreen_unbind(region->draw_buffer->offscreen, false); | ||||
| } | } | ||||
| } | } | ||||
| static void wm_draw_region_blit(ARegion *region, int view) | static void wm_draw_region_blit(ARegion *region, int view) | ||||
| { | { | ||||
| if (!region->draw_buffer) { | if (!region->draw_buffer) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (view == -1) { | if (view == -1) { | ||||
| /* Non-stereo drawing. */ | /* Non-stereo drawing. */ | ||||
| view = 0; | view = 0; | ||||
| } | } | ||||
| else if (view > 0) { | else if (view > 0) { | ||||
| if (region->draw_buffer->viewport[view] == NULL && | if (region->draw_buffer->viewport[view] == NULL) { | ||||
| region->draw_buffer->offscreen[view] == NULL) { | |||||
| /* Region does not need stereo or failed to allocate stereo buffers. */ | /* Region does not need stereo or failed to allocate stereo buffers. */ | ||||
| view = 0; | view = 0; | ||||
| } | } | ||||
| } | } | ||||
| if (region->draw_buffer->viewport[view]) { | if (region->draw_buffer->viewport[view]) { | ||||
| GPU_viewport_draw_to_screen(region->draw_buffer->viewport[view], ®ion->winrct); | GPU_viewport_draw_to_screen(region->draw_buffer->viewport[view], ®ion->winrct); | ||||
| } | } | ||||
| else { | else { | ||||
| GPU_offscreen_draw_to_screen( | GPU_offscreen_draw_to_screen( | ||||
| region->draw_buffer->offscreen[view], region->winrct.xmin, region->winrct.ymin); | region->draw_buffer->offscreen, region->winrct.xmin, region->winrct.ymin); | ||||
| } | } | ||||
| } | } | ||||
| GPUTexture *wm_draw_region_texture(ARegion *region, int view) | GPUTexture *wm_draw_region_texture(ARegion *region, int view) | ||||
| { | { | ||||
| if (!region->draw_buffer) { | if (!region->draw_buffer) { | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| if (region->draw_buffer->viewport[view]) { | if (region->draw_buffer->viewport[view]) { | ||||
| return GPU_viewport_color_texture(region->draw_buffer->viewport[view]); | return GPU_viewport_color_texture(region->draw_buffer->viewport[view]); | ||||
| } | } | ||||
| else { | else { | ||||
| return GPU_offscreen_color_texture(region->draw_buffer->offscreen[view]); | return GPU_offscreen_color_texture(region->draw_buffer->offscreen); | ||||
| } | } | ||||
| } | } | ||||
| void wm_draw_region_blend(ARegion *region, int view, bool blend) | void wm_draw_region_blend(ARegion *region, int view, bool blend) | ||||
| { | { | ||||
| if (!region->draw_buffer) { | if (!region->draw_buffer) { | ||||
| return; | return; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 578 Lines • Show Last 20 Lines | |||||