1329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen/* 2329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * Copyright © 2016 Intel Corporation 3329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 4329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * Permission is hereby granted, free of charge, to any person obtaining a 5329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * copy of this software and associated documentation files (the "Software"), 6329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * to deal in the Software without restriction, including without limitation 7329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * and/or sell copies of the Software, and to permit persons to whom the 9329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * Software is furnished to do so, subject to the following conditions: 10329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 11329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * The above copyright notice and this permission notice (including the next 12329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * paragraph) shall be included in all copies or substantial portions of the 13329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * Software. 14329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 15329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * DEALINGS IN THE SOFTWARE. 22329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen */ 23329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 24329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen#include <stdbool.h> 25329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen#include "context.h" 26329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen#include "debug_output.h" 27329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen#include "get.h" 28329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen#include "mtypes.h" 29329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen#include "macros.h" 30329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen#include "main/dispatch.h" /* for _gloffset_COUNT */ 31329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 32329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensenstatic void GLAPIENTRY 33329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen_context_lost_GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, 34329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen GLsizei *length, GLint *values) 35329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen{ 36329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen GET_CURRENT_CONTEXT(ctx); 37329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (ctx) 38329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _mesa_error(ctx, GL_CONTEXT_LOST, "GetSynciv(invalid call)"); 39329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 40329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (pname == GL_SYNC_STATUS && bufSize >= 1) 41329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen *values = GL_SIGNALED; 42329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen} 43329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 44329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensenstatic void GLAPIENTRY 45329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen_context_lost_GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params) 46329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen{ 47329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen GET_CURRENT_CONTEXT(ctx); 48329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (ctx) 49329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _mesa_error(ctx, GL_CONTEXT_LOST, "GetQueryObjectuiv(context lost)"); 50329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 51329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (pname == GL_QUERY_RESULT_AVAILABLE) 52329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen *params = GL_TRUE; 53329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen} 54329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 55329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensenstatic int 56329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensencontext_lost_nop_handler(void) 57329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen{ 58329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen GET_CURRENT_CONTEXT(ctx); 59329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (ctx) 60329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _mesa_error(ctx, GL_CONTEXT_LOST, "context lost"); 61329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 62329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen return 0; 63329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen} 64329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 65329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensenvoid 66329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen_mesa_set_context_lost_dispatch(struct gl_context *ctx) 67329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen{ 68329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (ctx->ContextLost == NULL) { 69329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen int numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT); 70329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 71329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen ctx->ContextLost = malloc(numEntries * sizeof(_glapi_proc)); 72329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (!ctx->ContextLost) 73329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen return; 74329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 75329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _glapi_proc *entry = (_glapi_proc *) ctx->ContextLost; 76329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen unsigned i; 77329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen for (i = 0; i < numEntries; i++) 78329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen entry[i] = (_glapi_proc) context_lost_nop_handler; 79329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 80329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen /* The ARB_robustness specification says: 81329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 82329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * "* GetError and GetGraphicsResetStatus behave normally following a 83329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * graphics reset, so that the application can determine a reset 84329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * has occurred, and when it is safe to destroy and recreate the 85329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * context. 86329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 87329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * * Any commands which might cause a polling application to block 88329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * indefinitely will generate a CONTEXT_LOST error, but will also 89329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * return a value indicating completion to the application. Such 90329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * commands include: 91329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 92329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * + GetSynciv with <pname> SYNC_STATUS ignores the other 93329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * parameters and returns SIGNALED in <values>. 94329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 95329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * + GetQueryObjectuiv with <pname> QUERY_RESULT_AVAILABLE 96329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * ignores the other parameters and returns TRUE in <params>." 97329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen */ 98329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen SET_GetError(ctx->ContextLost, _mesa_GetError); 99329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen SET_GetGraphicsResetStatusARB(ctx->ContextLost, _mesa_GetGraphicsResetStatusARB); 100329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen SET_GetSynciv(ctx->ContextLost, _context_lost_GetSynciv); 101329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen SET_GetQueryObjectuiv(ctx->ContextLost, _context_lost_GetQueryObjectuiv); 102329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen } 103329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 104329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen ctx->CurrentDispatch = ctx->ContextLost; 105329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _glapi_set_dispatch(ctx->CurrentDispatch); 106329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen} 107329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 108329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen/** 109329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * Returns an error code specified by GL_ARB_robustness, or GL_NO_ERROR. 110329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * \return current context status 111329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen */ 112329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg KristensenGLenum GLAPIENTRY 113329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen_mesa_GetGraphicsResetStatusARB( void ) 114329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen{ 115329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen GET_CURRENT_CONTEXT(ctx); 116329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen GLenum status = GL_NO_ERROR; 117329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 118329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen /* The ARB_robustness specification says: 119329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * 120329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * "If the reset notification behavior is NO_RESET_NOTIFICATION_ARB, 121329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * then the implementation will never deliver notification of reset 122329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * events, and GetGraphicsResetStatusARB will always return NO_ERROR." 123329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen */ 124329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (ctx->Const.ResetStrategy == GL_NO_RESET_NOTIFICATION_ARB) { 125329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (MESA_VERBOSE & VERBOSE_API) 126329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _mesa_debug(ctx, 127329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen "glGetGraphicsResetStatusARB always returns GL_NO_ERROR " 128329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen "because reset notifictation was not requested at context " 129329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen "creation.\n"); 130329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 131329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen return GL_NO_ERROR; 132329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen } 133329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 134329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (ctx->Driver.GetGraphicsResetStatus) { 135329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen /* Query the reset status of this context from the driver core. 136329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen */ 137329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen status = ctx->Driver.GetGraphicsResetStatus(ctx); 138329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 139329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen mtx_lock(&ctx->Shared->Mutex); 140329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 141329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen /* If this context has not been affected by a GPU reset, check to see if 142329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * some other context in the share group has been affected by a reset. 143329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * If another context saw a reset but this context did not, assume that 144329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen * this context was not guilty. 145329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen */ 146329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (status != GL_NO_ERROR) { 147329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen ctx->Shared->ShareGroupReset = true; 148329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen } else if (ctx->Shared->ShareGroupReset && !ctx->ShareGroupReset) { 149329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen status = GL_INNOCENT_CONTEXT_RESET_ARB; 150329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen } 151329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 152329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen ctx->ShareGroupReset = ctx->Shared->ShareGroupReset; 153329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen mtx_unlock(&ctx->Shared->Mutex); 154329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen } 155329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 156329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (status != GL_NO_ERROR) 157329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _mesa_set_context_lost_dispatch(ctx); 158329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 159329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen if (!ctx->Driver.GetGraphicsResetStatus && (MESA_VERBOSE & VERBOSE_API)) 160329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen _mesa_debug(ctx, 161329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen "glGetGraphicsResetStatusARB always returns GL_NO_ERROR " 162329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen "because the driver doesn't track reset status.\n"); 163329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen 164329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen return status; 165329d115ac68b40082540cf844c548e0656fbdbf9Kristian Høgsberg Kristensen} 166