From cedd894fe7d9dd0304c3bfd451b1135dc2e52040 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 30 Jul 2015 17:16:24 -0700 Subject: [PATCH] libobs-d3d11: Make sure current swap is valid --- libobs-d3d11/d3d11-subsystem.cpp | 62 ++++++++++++++++++++++++-------- libobs-d3d11/d3d11-subsystem.hpp | 2 +- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 4c77a3b01..e007b74f6 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -577,6 +577,11 @@ gs_swapchain_t *device_swapchain_create(gs_device_t *device, void device_resize(gs_device_t *device, uint32_t cx, uint32_t cy) { + if (!device->curSwapChain) { + blog(LOG_WARNING, "device_resize (D3D11): No active swap"); + return; + } + try { ID3D11RenderTargetView *renderView = NULL; ID3D11DepthStencilView *depthView = NULL; @@ -599,18 +604,34 @@ void device_resize(gs_device_t *device, uint32_t cx, uint32_t cy) void device_get_size(const gs_device_t *device, uint32_t *cx, uint32_t *cy) { - *cx = device->curSwapChain->target.width; - *cy = device->curSwapChain->target.height; + if (device->curSwapChain) { + *cx = device->curSwapChain->target.width; + *cy = device->curSwapChain->target.height; + } else { + blog(LOG_ERROR, "device_get_size (D3D11): no active swap"); + *cx = 0; + *cy = 0; + } } uint32_t device_get_width(const gs_device_t *device) { - return device->curSwapChain->target.width; + if (device->curSwapChain) { + return device->curSwapChain->target.width; + } else { + blog(LOG_ERROR, "device_get_size (D3D11): no active swap"); + return 0; + } } uint32_t device_get_height(const gs_device_t *device) { - return device->curSwapChain->target.height; + if (device->curSwapChain) { + return device->curSwapChain->target.height; + } else { + blog(LOG_ERROR, "device_get_size (D3D11): no active swap"); + return 0; + } } gs_texture_t *device_texture_create(gs_device_t *device, uint32_t width, @@ -1016,10 +1037,12 @@ gs_zstencil_t *device_get_zstencil_target(const gs_device_t *device) void device_set_render_target(gs_device_t *device, gs_texture_t *tex, gs_zstencil_t *zstencil) { - if (!tex) - tex = &device->curSwapChain->target; - if (!zstencil) - zstencil = &device->curSwapChain->zs; + if (device->curSwapChain) { + if (!tex) + tex = &device->curSwapChain->target; + if (!zstencil) + zstencil = &device->curSwapChain->zs; + } if (device->curRenderTarget == tex && device->curZStencilBuffer == zstencil) @@ -1049,13 +1072,15 @@ void device_set_render_target(gs_device_t *device, gs_texture_t *tex, void device_set_cube_render_target(gs_device_t *device, gs_texture_t *tex, int side, gs_zstencil_t *zstencil) { - if (!tex) { - tex = &device->curSwapChain->target; - side = 0; - } + if (device->curSwapChain) { + if (!tex) { + tex = &device->curSwapChain->target; + side = 0; + } - if (!zstencil) - zstencil = &device->curSwapChain->zs; + if (!zstencil) + zstencil = &device->curSwapChain->zs; + } if (device->curRenderTarget == tex && device->curRenderSide == side && @@ -1219,6 +1244,9 @@ void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode, if (!device->curVertexBuffer) throw "No vertex buffer specified"; + if (!device->curSwapChain && !device->curRenderTarget) + throw "No render target or swap chain to render to"; + gs_effect_t *effect = gs_get_effect(); if (effect) gs_effect_update_params(effect); @@ -1311,7 +1339,11 @@ void device_clear(gs_device_t *device, uint32_t clear_flags, void device_present(gs_device_t *device) { - device->curSwapChain->swap->Present(0, 0); + if (device->curSwapChain) { + device->curSwapChain->swap->Present(0, 0); + } else { + blog(LOG_WARNING, "device_present (D3D11): No active swap"); + } } void device_flush(gs_device_t *device) diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 188cad339..c176ae729 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -625,7 +625,7 @@ struct gs_device { gs_index_buffer *curIndexBuffer = nullptr; gs_vertex_shader *curVertexShader = nullptr; gs_pixel_shader *curPixelShader = nullptr; - gs_swap_chain *curSwapChain; + gs_swap_chain *curSwapChain = nullptr; bool zstencilStateChanged = true; bool rasterStateChanged = true;