X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fwgl%2Fstw_device.c;h=8e4459c67f7d19c5d60017ffdfc9813e0511124a;hb=26fc30ef83a9b1bb3d7379e7816e1f1eaafd6fb3;hp=61b207525cada81f5d468792daa12a777b16de89;hpb=35489ef285f1fde234b2b9bbb91fdc41fddefc02;p=mesa.git diff --git a/src/gallium/state_trackers/wgl/stw_device.c b/src/gallium/state_trackers/wgl/stw_device.c index 61b207525ca..8e4459c67f7 100644 --- a/src/gallium/state_trackers/wgl/stw_device.c +++ b/src/gallium/state_trackers/wgl/stw_device.c @@ -27,7 +27,7 @@ #include -#include "glapi/glthread.h" +#include "glapi/glapi.h" #include "util/u_debug.h" #include "util/u_math.h" #include "util/u_memory.h" @@ -41,13 +41,27 @@ #include "stw_framebuffer.h" #include "stw_st.h" -#ifdef WIN32_THREADS -extern _glthread_Mutex OneTimeLock; -#endif - struct stw_device *stw_dev = NULL; +static int +stw_get_param(struct st_manager *smapi, + enum st_manager_param param) +{ + 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; + } +} boolean stw_init(const struct stw_winsys *stw_winsys) @@ -70,10 +84,6 @@ 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) @@ -87,8 +97,13 @@ stw_init(const struct stw_winsys *stw_winsys) 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; + 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 ); @@ -102,8 +117,7 @@ stw_init(const struct stw_winsys *stw_winsys) return TRUE; error1: - if (stw_dev->smapi) - FREE(stw_dev->smapi); + FREE(stw_dev->smapi); if (stw_dev->stapi) stw_dev->stapi->destroy(stw_dev->stapi); @@ -161,9 +175,8 @@ stw_cleanup(void) stw_dev->screen->destroy(stw_dev->screen); -#ifdef WIN32_THREADS - _glthread_DESTROY_MUTEX(OneTimeLock); - + /* glapi is statically linked: we can call the local destroy function. */ +#ifdef _GLAPI_NO_EXPORTS _glapi_destroy_multithread(); #endif