Changeset View
Changeset View
Standalone View
Standalone View
source/blender/gpu/intern/gpu_viewport.c
| Show First 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | |||||
| static void gpu_viewport_buffers_free(FramebufferList *fbl, | static void gpu_viewport_buffers_free(FramebufferList *fbl, | ||||
| int fbl_len, | int fbl_len, | ||||
| TextureList *txl, | TextureList *txl, | ||||
| int txl_len); | int txl_len); | ||||
| static void gpu_viewport_storage_free(StorageList *stl, int stl_len); | static void gpu_viewport_storage_free(StorageList *stl, int stl_len); | ||||
| static void gpu_viewport_passes_free(PassList *psl, int psl_len); | static void gpu_viewport_passes_free(PassList *psl, int psl_len); | ||||
| static void gpu_viewport_texture_pool_free(GPUViewport *viewport); | static void gpu_viewport_texture_pool_free(GPUViewport *viewport); | ||||
| static void gpu_viewport_default_fb_create(GPUViewport *viewport); | static void gpu_viewport_default_fb_create(GPUViewport *viewport, const bool high_bitdepth); | ||||
| void GPU_viewport_tag_update(GPUViewport *viewport) | void GPU_viewport_tag_update(GPUViewport *viewport) | ||||
| { | { | ||||
| viewport->flag |= DO_UPDATE; | viewport->flag |= DO_UPDATE; | ||||
| } | } | ||||
| bool GPU_viewport_do_update(GPUViewport *viewport) | bool GPU_viewport_do_update(GPUViewport *viewport) | ||||
| { | { | ||||
| Show All 23 Lines | GPUViewport *GPU_viewport_create_from_offscreen(struct GPUOffScreen *ofs) | ||||
| viewport->size[1] = GPU_offscreen_height(ofs); | viewport->size[1] = GPU_offscreen_height(ofs); | ||||
| GPU_offscreen_viewport_data_get(ofs, &fb, &color, &depth); | GPU_offscreen_viewport_data_get(ofs, &fb, &color, &depth); | ||||
| if (GPU_texture_samples(color)) { | if (GPU_texture_samples(color)) { | ||||
| viewport->txl->multisample_color = color; | viewport->txl->multisample_color = color; | ||||
| viewport->txl->multisample_depth = depth; | viewport->txl->multisample_depth = depth; | ||||
| viewport->fbl->multisample_fb = fb; | viewport->fbl->multisample_fb = fb; | ||||
| gpu_viewport_default_fb_create(viewport); | gpu_viewport_default_fb_create(viewport, true); | ||||
| } | } | ||||
| else { | else { | ||||
| viewport->fbl->default_fb = fb; | viewport->fbl->default_fb = fb; | ||||
| viewport->txl->color = color; | viewport->txl->color = color; | ||||
| viewport->txl->depth = depth; | viewport->txl->depth = depth; | ||||
| GPU_framebuffer_ensure_config( | GPU_framebuffer_ensure_config( | ||||
| &viewport->fbl->color_only_fb, | &viewport->fbl->color_only_fb, | ||||
| {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(viewport->txl->color)}); | {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(viewport->txl->color)}); | ||||
| ▲ Show 20 Lines • Show All 232 Lines • ▼ Show 20 Lines | void GPU_viewport_cache_release(GPUViewport *viewport) | ||||
| for (int i = 0; i < MAX_ENABLE_ENGINE && viewport->engine_data[i].handle; i++) { | for (int i = 0; i < MAX_ENABLE_ENGINE && viewport->engine_data[i].handle; i++) { | ||||
| ViewportEngineData *data = viewport->engine_data[i].data; | ViewportEngineData *data = viewport->engine_data[i].data; | ||||
| int psl_len; | int psl_len; | ||||
| DRW_engine_viewport_data_size_get(data->engine_type, NULL, NULL, &psl_len, NULL); | DRW_engine_viewport_data_size_get(data->engine_type, NULL, NULL, &psl_len, NULL); | ||||
| gpu_viewport_passes_free(data->psl, psl_len); | gpu_viewport_passes_free(data->psl, psl_len); | ||||
| } | } | ||||
| } | } | ||||
| static void gpu_viewport_default_fb_create(GPUViewport *viewport) | static void gpu_viewport_default_fb_create(GPUViewport *viewport, const bool high_bitdepth) | ||||
| { | { | ||||
| DefaultFramebufferList *dfbl = viewport->fbl; | DefaultFramebufferList *dfbl = viewport->fbl; | ||||
| DefaultTextureList *dtxl = viewport->txl; | DefaultTextureList *dtxl = viewport->txl; | ||||
| int *size = viewport->size; | int *size = viewport->size; | ||||
| bool ok = true; | bool ok = true; | ||||
| dtxl->color = GPU_texture_create_2d(size[0], size[1], GPU_RGBA8, NULL, NULL); | dtxl->color = GPU_texture_create_2d( | ||||
| size[0], size[1], high_bitdepth ? GPU_RGBA16F : GPU_RGBA8, NULL, NULL); | |||||
| dtxl->depth = GPU_texture_create_2d(size[0], size[1], GPU_DEPTH24_STENCIL8, NULL, NULL); | dtxl->depth = GPU_texture_create_2d(size[0], size[1], GPU_DEPTH24_STENCIL8, NULL, NULL); | ||||
| if (!(dtxl->depth && dtxl->color)) { | if (!(dtxl->depth && dtxl->color)) { | ||||
| ok = false; | ok = false; | ||||
| goto cleanup; | goto cleanup; | ||||
| } | } | ||||
| GPU_framebuffer_ensure_config( | GPU_framebuffer_ensure_config( | ||||
| ▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect) | ||||
| /* Multisample Buffer */ | /* Multisample Buffer */ | ||||
| if (viewport->samples > 0) { | if (viewport->samples > 0) { | ||||
| if (!dfbl->default_fb) { | if (!dfbl->default_fb) { | ||||
| gpu_viewport_default_multisample_fb_create(viewport); | gpu_viewport_default_multisample_fb_create(viewport); | ||||
| } | } | ||||
| } | } | ||||
| if (!dfbl->default_fb) { | if (!dfbl->default_fb) { | ||||
| gpu_viewport_default_fb_create(viewport); | gpu_viewport_default_fb_create(viewport, false); | ||||
| } | } | ||||
| } | } | ||||
| void GPU_viewport_draw_to_screen(GPUViewport *viewport, const rcti *rect) | void GPU_viewport_draw_to_screen(GPUViewport *viewport, const rcti *rect) | ||||
| { | { | ||||
| DefaultFramebufferList *dfbl = viewport->fbl; | DefaultFramebufferList *dfbl = viewport->fbl; | ||||
| if (dfbl->default_fb == NULL) { | if (dfbl->default_fb == NULL) { | ||||
| ▲ Show 20 Lines • Show All 146 Lines • Show Last 20 Lines | |||||