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
16namespace gpu {
17namespace gles2 {
18
19class 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
60class 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
66class 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