• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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