X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fwgl%2Fstw_device.c;h=e65e71dc15fb58ac4ff25da7f387df5099e0709f;hb=4683529048ee133481b2d8f1cae1685aa1736f9a;hp=ea300f27cb56ed912dbba39a2b01a64e34b4ec96;hpb=dff50ff592da7cb1d784fae794dd1647a5445bca;p=mesa.git diff --git a/src/gallium/state_trackers/wgl/stw_device.c b/src/gallium/state_trackers/wgl/stw_device.c index ea300f27cb5..e65e71dc15f 100644 --- a/src/gallium/state_trackers/wgl/stw_device.c +++ b/src/gallium/state_trackers/wgl/stw_device.c @@ -27,11 +27,11 @@ #include -#include "glapi/glthread.h" +#include "glapi/glapi.h" #include "util/u_debug.h" #include "util/u_math.h" +#include "util/u_memory.h" #include "pipe/p_screen.h" -#include "state_tracker/st_public.h" #include "stw_device.h" #include "stw_winsys.h" @@ -39,37 +39,30 @@ #include "stw_icd.h" #include "stw_tls.h" #include "stw_framebuffer.h" - -#ifdef WIN32_THREADS -extern _glthread_Mutex OneTimeLock; -#endif +#include "stw_st.h" struct stw_device *stw_dev = NULL; - -/** - * XXX: Dispatch pipe_screen::flush_front_buffer to our - * stw_winsys::flush_front_buffer. - */ -static void -stw_flush_frontbuffer(struct pipe_screen *screen, - struct pipe_surface *surface, - void *context_private ) +static int +stw_get_param(struct st_manager *smapi, + enum st_manager_param param) { - HDC hdc = (HDC)context_private; - struct stw_framebuffer *fb; - - fb = stw_framebuffer_from_hdc( hdc ); - if (!fb) { - /* fb can be NULL if window was destroyed already */ - return; + switch (param) { + case ST_MANAGER_BROKEN_INVALIDATE: + /* + * Force framebuffer validation on glViewport. + * + * Certain applications, like Rhinoceros 4, uses glReadPixels + * exclusively (never uses SwapBuffers), so framebuffers never get + * resized unless we check on glViewport. + */ + return 1; + default: + return 0; } - - stw_framebuffer_present_locked(hdc, fb, surface); } - boolean stw_init(const struct stw_winsys *stw_winsys) { @@ -91,9 +84,10 @@ stw_init(const struct stw_winsys *stw_winsys) stw_dev->stw_winsys = stw_winsys; -#ifdef WIN32_THREADS - _glthread_INIT_MUTEX(OneTimeLock); -#endif + stw_dev->stapi = stw_st_create_api(); + stw_dev->smapi = CALLOC_STRUCT(st_manager); + if (!stw_dev->stapi || !stw_dev->smapi) + goto error1; screen = stw_winsys->create_screen(); if(!screen) @@ -102,12 +96,14 @@ stw_init(const struct stw_winsys *stw_winsys) if(stw_winsys->get_adapter_luid) stw_winsys->get_adapter_luid(screen, &stw_dev->AdapterLuid); + stw_dev->smapi->screen = screen; + stw_dev->smapi->get_param = stw_get_param; stw_dev->screen = screen; - /* XXX - */ - stw_dev->screen->flush_frontbuffer = &stw_flush_frontbuffer; - + stw_dev->max_2d_levels = + screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS); + stw_dev->max_2d_length = 1 << (stw_dev->max_2d_levels - 1); + pipe_mutex_init( stw_dev->ctx_mutex ); pipe_mutex_init( stw_dev->fb_mutex ); @@ -121,6 +117,11 @@ stw_init(const struct stw_winsys *stw_winsys) return TRUE; error1: + if (stw_dev->smapi) + FREE(stw_dev->smapi); + if (stw_dev->stapi) + stw_dev->stapi->destroy(stw_dev->stapi); + stw_dev = NULL; return FALSE; } @@ -170,11 +171,13 @@ stw_cleanup(void) pipe_mutex_destroy( stw_dev->fb_mutex ); pipe_mutex_destroy( stw_dev->ctx_mutex ); - stw_dev->screen->destroy(stw_dev->screen); + FREE(stw_dev->smapi); + stw_dev->stapi->destroy(stw_dev->stapi); -#ifdef WIN32_THREADS - _glthread_DESTROY_MUTEX(OneTimeLock); + stw_dev->screen->destroy(stw_dev->screen); + /* glapi is statically linked: we can call the local destroy function. */ +#ifdef _GLAPI_NO_EXPORTS _glapi_destroy_multithread(); #endif