error_state.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This file contains the ErrorState class. 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_ERROR_STATE_H_ 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_ERROR_STATE_H_ 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/common/types.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/gpu_export.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace gpu { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace gles2 { 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Logger; 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use these macro to synthesize GL errors instead of calling the error_state 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// functions directly as they will propogate the __FILE__ and __LINE__. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use to synthesize a GL error on the error_state. 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ERRORSTATE_SET_GL_ERROR(error_state, error, function_name, msg) \ 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state->SetGLError(__FILE__, __LINE__, error, function_name, msg) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use to synthesize an INVALID_ENUM GL error on the error_state. Will attempt 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to expand the enum to a string. 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( \ 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state, function_name, value, label) \ 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state->SetGLErrorInvalidEnum( \ 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) __FILE__, __LINE__, function_name, value, label) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use to synthesize a GL error on the error_state for an invalid enum based 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// parameter. Will attempt to expand the parameter to a string. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ERRORSTATE_SET_GL_ERROR_INVALID_PARAM( \ 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state, error, function_name, pname, param) \ 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state->SetGLErrorInvalidParam( \ 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) __FILE__, __LINE__, error, function_name, pname, param) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use to move all pending error to the wrapper so on your next GL call 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// you can see if that call generates an error. 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, function_name) \ 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state->CopyRealGLErrorsToWrapper(__FILE__, __LINE__, function_name) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use to look at the real GL error and still pass it on to the user. 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ERRORSTATE_PEEK_GL_ERROR(error_state, function_name) \ 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state->PeekGLError(__FILE__, __LINE__, function_name) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use to clear all current GL errors. FAILS if there are any. 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ERRORSTATE_CLEAR_REAL_GL_ERRORS(error_state, function_name) \ 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state->ClearRealGLErrors(__FILE__, __LINE__, function_name) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GPU_EXPORT ErrorState { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~ErrorState(); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static ErrorState* Create(Logger* logger); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual uint32 GetGLError() = 0; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetGLError( 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* filename, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int line, 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned int error, 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* function_name, 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* msg) = 0; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetGLErrorInvalidEnum( 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* filename, 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int line, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* function_name, 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned int value, 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* label) = 0; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetGLErrorInvalidParam( 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* filename, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int line, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned int error, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* function_name, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned int pname, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int param) = 0; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Gets the GLError and stores it in our wrapper. Effectively 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // this lets us peek at the error without losing it. 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual unsigned int PeekGLError( 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* filename, int line, const char* function_name) = 0; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Copies the real GL errors to the wrapper. This is so we can 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // make sure there are no native GL errors before calling some GL function 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so that on return we know any error generated was for that specific 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // command. 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void CopyRealGLErrorsToWrapper( 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* filename, int line, const char* function_name) = 0; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear all real GL errors. This is to prevent the client from seeing any 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // errors caused by GL calls that it was not responsible for issuing. 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ClearRealGLErrors( 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* filename, int line, const char* function_name) = 0; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ErrorState(); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ErrorState); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace gles2 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace gpu 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_ERROR_STATE_H_ 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108