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