mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 09:05:12 +00:00
wined3d: Move backup window / DC handling from the swapchain to the device.
This commit is contained in:
parent
b12cae8c99
commit
242cdaee82
|
@ -1258,7 +1258,7 @@ success:
|
||||||
|
|
||||||
static BOOL wined3d_context_gl_set_gl_context(struct wined3d_context_gl *context_gl)
|
static BOOL wined3d_context_gl_set_gl_context(struct wined3d_context_gl *context_gl)
|
||||||
{
|
{
|
||||||
struct wined3d_swapchain_gl *swapchain_gl = wined3d_swapchain_gl(context_gl->c.swapchain);
|
struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
|
||||||
BOOL backup = FALSE;
|
BOOL backup = FALSE;
|
||||||
|
|
||||||
if (!wined3d_context_gl_set_pixel_format(context_gl))
|
if (!wined3d_context_gl_set_pixel_format(context_gl))
|
||||||
|
@ -1275,23 +1275,20 @@ static BOOL wined3d_context_gl_set_gl_context(struct wined3d_context_gl *context
|
||||||
context_gl->valid = 0;
|
context_gl->valid = 0;
|
||||||
WARN("Trying fallback to the backup window.\n");
|
WARN("Trying fallback to the backup window.\n");
|
||||||
|
|
||||||
/* FIXME: If the context is destroyed it's no longer associated with
|
if (context_gl->c.destroyed)
|
||||||
* a swapchain, so we can't use the swapchain to get a backup dc. To
|
|
||||||
* make this work windowless contexts would need to be handled by the
|
|
||||||
* device. */
|
|
||||||
if (context_gl->c.destroyed || !swapchain_gl)
|
|
||||||
{
|
{
|
||||||
FIXME("Unable to get backup dc for destroyed context %p.\n", context_gl);
|
FIXME("Unable to get backup dc for destroyed context %p.\n", context_gl);
|
||||||
wined3d_context_gl_set_current(NULL);
|
wined3d_context_gl_set_current(NULL);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(context_gl->dc = wined3d_swapchain_gl_get_backup_dc(swapchain_gl)))
|
if (!(context_gl->dc = wined3d_device_gl_get_backup_dc(device_gl)))
|
||||||
{
|
{
|
||||||
wined3d_context_gl_set_current(NULL);
|
wined3d_context_gl_set_current(NULL);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE("Using backup DC %p.\n", context_gl->dc);
|
||||||
context_gl->dc_is_private = TRUE;
|
context_gl->dc_is_private = TRUE;
|
||||||
context_gl->dc_has_format = FALSE;
|
context_gl->dc_has_format = FALSE;
|
||||||
|
|
||||||
|
@ -2032,7 +2029,7 @@ static BOOL wined3d_context_gl_create_wgl_ctx(struct wined3d_context_gl *context
|
||||||
context_gl->pixel_format, context_gl->dc);
|
context_gl->pixel_format, context_gl->dc);
|
||||||
|
|
||||||
wined3d_release_dc(context_gl->window, context_gl->dc);
|
wined3d_release_dc(context_gl->window, context_gl->dc);
|
||||||
if (!(context_gl->dc = wined3d_swapchain_gl_get_backup_dc(swapchain_gl)))
|
if (!(context_gl->dc = wined3d_device_gl_get_backup_dc(wined3d_device_gl(device))))
|
||||||
{
|
{
|
||||||
ERR("Failed to retrieve the backup device context.\n");
|
ERR("Failed to retrieve the backup device context.\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -2109,7 +2106,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi
|
||||||
|
|
||||||
if (!context_gl->dc)
|
if (!context_gl->dc)
|
||||||
{
|
{
|
||||||
if (!(context_gl->dc = wined3d_swapchain_gl_get_backup_dc(swapchain_gl)))
|
if (!(context_gl->dc = wined3d_device_gl_get_backup_dc(wined3d_device_gl(device))))
|
||||||
{
|
{
|
||||||
ERR("Failed to retrieve a device context.\n");
|
ERR("Failed to retrieve a device context.\n");
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
@ -2354,6 +2351,7 @@ void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl)
|
||||||
context_gl->c.destroy_delayed = 1;
|
context_gl->c.destroy_delayed = 1;
|
||||||
/* FIXME: Get rid of a pointer to swapchain from wined3d_context. */
|
/* FIXME: Get rid of a pointer to swapchain from wined3d_context. */
|
||||||
context_gl->c.swapchain = NULL;
|
context_gl->c.swapchain = NULL;
|
||||||
|
context_gl->c.device = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1225,6 +1225,14 @@ void wined3d_device_gl_delete_opengl_contexts_cs(void *object)
|
||||||
else
|
else
|
||||||
wined3d_context_gl_destroy(wined3d_context_gl(device->contexts[0]));
|
wined3d_context_gl_destroy(wined3d_context_gl(device->contexts[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (device_gl->backup_dc)
|
||||||
|
{
|
||||||
|
TRACE("Destroying backup wined3d window %p, dc %p.\n", device_gl->backup_wnd, device_gl->backup_dc);
|
||||||
|
|
||||||
|
wined3d_release_dc(device_gl->backup_wnd, device_gl->backup_dc);
|
||||||
|
DestroyWindow(device_gl->backup_wnd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wined3d_device_gl_create_primary_opengl_context_cs(void *object)
|
void wined3d_device_gl_create_primary_opengl_context_cs(void *object)
|
||||||
|
@ -5913,6 +5921,33 @@ void CDECL wined3d_device_get_gamma_ramp(const struct wined3d_device *device,
|
||||||
wined3d_swapchain_get_gamma_ramp(swapchain, ramp);
|
wined3d_swapchain_get_gamma_ramp(swapchain, ramp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HDC wined3d_device_gl_get_backup_dc(struct wined3d_device_gl *device_gl)
|
||||||
|
{
|
||||||
|
TRACE("device_gl %p.\n", device_gl);
|
||||||
|
|
||||||
|
if (!device_gl->backup_dc)
|
||||||
|
{
|
||||||
|
TRACE("Creating the backup window for device %p.\n", device_gl);
|
||||||
|
|
||||||
|
if (!(device_gl->backup_wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
|
||||||
|
WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL)))
|
||||||
|
{
|
||||||
|
ERR("Failed to create a window.\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(device_gl->backup_dc = GetDC(device_gl->backup_wnd)))
|
||||||
|
{
|
||||||
|
ERR("Failed to get a DC.\n");
|
||||||
|
DestroyWindow(device_gl->backup_wnd);
|
||||||
|
device_gl->backup_wnd = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return device_gl->backup_dc;
|
||||||
|
}
|
||||||
|
|
||||||
void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource)
|
void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource)
|
||||||
{
|
{
|
||||||
TRACE("device %p, resource %p.\n", device, resource);
|
TRACE("device %p, resource %p.\n", device, resource);
|
||||||
|
|
|
@ -98,14 +98,6 @@ void wined3d_swapchain_gl_cleanup(struct wined3d_swapchain_gl *swapchain_gl)
|
||||||
|
|
||||||
wined3d_cs_destroy_object(cs, wined3d_swapchain_gl_destroy_object, swapchain_gl);
|
wined3d_cs_destroy_object(cs, wined3d_swapchain_gl_destroy_object, swapchain_gl);
|
||||||
wined3d_cs_finish(cs, WINED3D_CS_QUEUE_DEFAULT);
|
wined3d_cs_finish(cs, WINED3D_CS_QUEUE_DEFAULT);
|
||||||
|
|
||||||
if (swapchain_gl->backup_dc)
|
|
||||||
{
|
|
||||||
TRACE("Destroying backup wined3d window %p, dc %p.\n", swapchain_gl->backup_wnd, swapchain_gl->backup_dc);
|
|
||||||
|
|
||||||
wined3d_release_dc(swapchain_gl->backup_wnd, swapchain_gl->backup_dc);
|
|
||||||
DestroyWindow(swapchain_gl->backup_wnd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wined3d_swapchain_vk_destroy_vulkan_swapchain(struct wined3d_swapchain_vk *swapchain_vk)
|
static void wined3d_swapchain_vk_destroy_vulkan_swapchain(struct wined3d_swapchain_vk *swapchain_vk)
|
||||||
|
@ -610,7 +602,8 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
|
||||||
TRACE("Presenting DC %p.\n", context_gl->dc);
|
TRACE("Presenting DC %p.\n", context_gl->dc);
|
||||||
|
|
||||||
pixel_format = &wined3d_adapter_gl(swapchain->device->adapter)->pixel_formats[context_gl->pixel_format];
|
pixel_format = &wined3d_adapter_gl(swapchain->device->adapter)->pixel_formats[context_gl->pixel_format];
|
||||||
if (context_gl->dc == swapchain_gl->backup_dc || (pixel_format->swap_method != WGL_SWAP_COPY_ARB
|
if (context_gl->dc == wined3d_device_gl(swapchain->device)->backup_dc
|
||||||
|
|| (pixel_format->swap_method != WGL_SWAP_COPY_ARB
|
||||||
&& swapchain_present_is_partial_copy(swapchain, dst_rect)))
|
&& swapchain_present_is_partial_copy(swapchain, dst_rect)))
|
||||||
{
|
{
|
||||||
swapchain_blit_gdi(swapchain, context, src_rect, dst_rect);
|
swapchain_blit_gdi(swapchain, context, src_rect, dst_rect);
|
||||||
|
@ -1842,31 +1835,6 @@ struct wined3d_context_gl *wined3d_swapchain_gl_get_context(struct wined3d_swapc
|
||||||
return wined3d_swapchain_gl_create_context(swapchain_gl);
|
return wined3d_swapchain_gl_create_context(swapchain_gl);
|
||||||
}
|
}
|
||||||
|
|
||||||
HDC wined3d_swapchain_gl_get_backup_dc(struct wined3d_swapchain_gl *swapchain_gl)
|
|
||||||
{
|
|
||||||
if (!swapchain_gl->backup_dc)
|
|
||||||
{
|
|
||||||
TRACE("Creating the backup window for swapchain %p.\n", swapchain_gl);
|
|
||||||
|
|
||||||
if (!(swapchain_gl->backup_wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
|
|
||||||
WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL)))
|
|
||||||
{
|
|
||||||
ERR("Failed to create a window.\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(swapchain_gl->backup_dc = GetDC(swapchain_gl->backup_wnd)))
|
|
||||||
{
|
|
||||||
ERR("Failed to get a DC.\n");
|
|
||||||
DestroyWindow(swapchain_gl->backup_wnd);
|
|
||||||
swapchain_gl->backup_wnd = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return swapchain_gl->backup_dc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
|
void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
|
||||||
{
|
{
|
||||||
UINT i;
|
UINT i;
|
||||||
|
|
|
@ -4294,6 +4294,9 @@ struct wined3d_device_gl
|
||||||
} *retired_blocks;
|
} *retired_blocks;
|
||||||
SIZE_T retired_blocks_size;
|
SIZE_T retired_blocks_size;
|
||||||
SIZE_T retired_block_count;
|
SIZE_T retired_block_count;
|
||||||
|
|
||||||
|
HWND backup_wnd;
|
||||||
|
HDC backup_dc;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct wined3d_device_gl *wined3d_device_gl(struct wined3d_device *device)
|
static inline struct wined3d_device_gl *wined3d_device_gl(struct wined3d_device *device)
|
||||||
|
@ -4331,6 +4334,7 @@ bool wined3d_device_gl_create_bo(struct wined3d_device_gl *device_gl,
|
||||||
GLenum usage, bool coherent, GLbitfield flags, struct wined3d_bo_gl *bo) DECLSPEC_HIDDEN;
|
GLenum usage, bool coherent, GLbitfield flags, struct wined3d_bo_gl *bo) DECLSPEC_HIDDEN;
|
||||||
void wined3d_device_gl_create_primary_opengl_context_cs(void *object) DECLSPEC_HIDDEN;
|
void wined3d_device_gl_create_primary_opengl_context_cs(void *object) DECLSPEC_HIDDEN;
|
||||||
void wined3d_device_gl_delete_opengl_contexts_cs(void *object) DECLSPEC_HIDDEN;
|
void wined3d_device_gl_delete_opengl_contexts_cs(void *object) DECLSPEC_HIDDEN;
|
||||||
|
HDC wined3d_device_gl_get_backup_dc(struct wined3d_device_gl *device_gl) DECLSPEC_HIDDEN;
|
||||||
GLbitfield wined3d_device_gl_get_memory_type_flags(unsigned int memory_type_idx) DECLSPEC_HIDDEN;
|
GLbitfield wined3d_device_gl_get_memory_type_flags(unsigned int memory_type_idx) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
static inline float wined3d_alpha_ref(const struct wined3d_state *state)
|
static inline float wined3d_alpha_ref(const struct wined3d_state *state)
|
||||||
|
@ -5708,9 +5712,6 @@ struct wined3d_swapchain_gl
|
||||||
struct wined3d_context_gl **contexts;
|
struct wined3d_context_gl **contexts;
|
||||||
SIZE_T contexts_size;
|
SIZE_T contexts_size;
|
||||||
SIZE_T context_count;
|
SIZE_T context_count;
|
||||||
|
|
||||||
HDC backup_dc;
|
|
||||||
HWND backup_wnd;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct wined3d_swapchain_gl *wined3d_swapchain_gl(struct wined3d_swapchain *swapchain)
|
static inline struct wined3d_swapchain_gl *wined3d_swapchain_gl(struct wined3d_swapchain *swapchain)
|
||||||
|
@ -5720,7 +5721,6 @@ static inline struct wined3d_swapchain_gl *wined3d_swapchain_gl(struct wined3d_s
|
||||||
|
|
||||||
void wined3d_swapchain_gl_cleanup(struct wined3d_swapchain_gl *swapchain_gl) DECLSPEC_HIDDEN;
|
void wined3d_swapchain_gl_cleanup(struct wined3d_swapchain_gl *swapchain_gl) DECLSPEC_HIDDEN;
|
||||||
void wined3d_swapchain_gl_destroy_contexts(struct wined3d_swapchain_gl *swapchain_gl) DECLSPEC_HIDDEN;
|
void wined3d_swapchain_gl_destroy_contexts(struct wined3d_swapchain_gl *swapchain_gl) DECLSPEC_HIDDEN;
|
||||||
HDC wined3d_swapchain_gl_get_backup_dc(struct wined3d_swapchain_gl *swapchain_gl) DECLSPEC_HIDDEN;
|
|
||||||
struct wined3d_context_gl *wined3d_swapchain_gl_get_context(struct wined3d_swapchain_gl *swapchain_gl) DECLSPEC_HIDDEN;
|
struct wined3d_context_gl *wined3d_swapchain_gl_get_context(struct wined3d_swapchain_gl *swapchain_gl) DECLSPEC_HIDDEN;
|
||||||
HRESULT wined3d_swapchain_gl_init(struct wined3d_swapchain_gl *swapchain_gl,
|
HRESULT wined3d_swapchain_gl_init(struct wined3d_swapchain_gl *swapchain_gl,
|
||||||
struct wined3d_device *device, struct wined3d_swapchain_desc *desc,
|
struct wined3d_device *device, struct wined3d_swapchain_desc *desc,
|
||||||
|
|
Loading…
Reference in a new issue