Blender  V3.3
gpu_shader_private.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #pragma once
8 
9 #include "BLI_span.hh"
10 #include "BLI_string_ref.hh"
11 
12 #include "GPU_shader.h"
14 #include "gpu_shader_interface.hh"
16 
17 #include <string>
18 
19 namespace blender {
20 namespace gpu {
21 
22 class GPULogParser;
23 
28 class Shader {
29  public:
31  ShaderInterface *interface = nullptr;
32 
33  protected:
35  char name[64];
36 
37  public:
38  Shader(const char *name);
39  virtual ~Shader();
40 
45  virtual bool finalize(const shader::ShaderCreateInfo *info = nullptr) = 0;
46 
48  eGPUShaderTFBType geom_type) = 0;
50  virtual void transform_feedback_disable() = 0;
51 
52  virtual void bind() = 0;
53  virtual void unbind() = 0;
54 
55  virtual void uniform_float(int location, int comp_len, int array_size, const float *data) = 0;
56  virtual void uniform_int(int location, int comp_len, int array_size, const int *data) = 0;
57 
58  virtual void vertformat_from_shader(GPUVertFormat *) const = 0;
59 
60  std::string defines_declare(const shader::ShaderCreateInfo &info) const;
61  virtual std::string resources_declare(const shader::ShaderCreateInfo &info) const = 0;
62  virtual std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const = 0;
63  virtual std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const = 0;
64  virtual std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const = 0;
65  virtual std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const = 0;
66  virtual std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const = 0;
67 
68  /* DEPRECATED: Kept only because of BGL API. */
69  virtual int program_handle_get() const = 0;
70 
71  inline const char *const name_get() const
72  {
73  return name;
74  };
75 
76  protected:
77  void print_log(
78  Span<const char *> sources, char *log, const char *stage, bool error, GPULogParser *parser);
79 };
80 
81 /* Syntactic sugar. */
82 static inline GPUShader *wrap(Shader *vert)
83 {
84  return reinterpret_cast<GPUShader *>(vert);
85 }
86 static inline Shader *unwrap(GPUShader *vert)
87 {
88  return reinterpret_cast<Shader *>(vert);
89 }
90 static inline const Shader *unwrap(const GPUShader *vert)
91 {
92  return reinterpret_cast<const Shader *>(vert);
93 }
94 
95 enum class Severity {
96  Unknown,
97  Warning,
98  Error,
99 };
100 
101 struct LogCursor {
102  int source = -1;
103  int row = -1;
104  int column = -1;
105 };
106 
107 struct GPULogItem {
109  bool source_base_row = false;
111 };
112 
114  public:
115  virtual char *parse_line(char *log_line, GPULogItem &log_item) = 0;
116 
117  protected:
118  char *skip_severity(char *log_line,
119  GPULogItem &log_item,
120  const char *error_msg,
121  const char *warning_msg) const;
122  char *skip_separators(char *log_line, const StringRef separators) const;
123  char *skip_until(char *log_line, char stop_char) const;
124  bool at_number(const char *log_line) const;
125  bool at_any(const char *log_line, const StringRef chars) const;
126  int parse_number(const char *log_line, char **r_new_position) const;
127 
128  MEM_CXX_CLASS_ALLOC_FUNCS("GPULogParser");
129 };
130 
131 } // namespace gpu
132 } // namespace blender
133 
134 /* XXX do not use it. Special hack to use OCIO with batch API. */
struct GPUShader GPUShader
Definition: GPU_shader.h:20
eGPUShaderTFBType
Definition: GPU_shader.h:22
struct GPUVertBuf GPUVertBuf
char * skip_separators(char *log_line, const StringRef separators) const
char * skip_severity(char *log_line, GPULogItem &log_item, const char *error_msg, const char *warning_msg) const
virtual char * parse_line(char *log_line, GPULogItem &log_item)=0
bool at_number(const char *log_line) const
int parse_number(const char *log_line, char **r_new_position) const
bool at_any(const char *log_line, const StringRef chars) const
char * skip_until(char *log_line, char stop_char) const
MEM_CXX_CLASS_ALLOC_FUNCS("GPULogParser")
virtual void unbind()=0
virtual std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const =0
virtual void transform_feedback_names_set(Span< const char * > name_list, eGPUShaderTFBType geom_type)=0
virtual void uniform_int(int location, int comp_len, int array_size, const int *data)=0
std::string defines_declare(const shader::ShaderCreateInfo &info) const
Definition: gpu_shader.cc:30
virtual void fragment_shader_from_glsl(MutableSpan< const char * > sources)=0
void print_log(Span< const char * > sources, char *log, const char *stage, bool error, GPULogParser *parser)
const char *const name_get() const
virtual void transform_feedback_disable()=0
virtual bool transform_feedback_enable(GPUVertBuf *)=0
virtual std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const =0
virtual bool finalize(const shader::ShaderCreateInfo *info=nullptr)=0
virtual std::string resources_declare(const shader::ShaderCreateInfo &info) const =0
virtual std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const =0
virtual void vertex_shader_from_glsl(MutableSpan< const char * > sources)=0
virtual void vertformat_from_shader(GPUVertFormat *) const =0
virtual void compute_shader_from_glsl(MutableSpan< const char * > sources)=0
virtual std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const =0
virtual void geometry_shader_from_glsl(MutableSpan< const char * > sources)=0
virtual int program_handle_get() const =0
virtual void uniform_float(int location, int comp_len, int array_size, const float *data)=0
virtual void bind()=0
virtual std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const =0
Shader(const char *name)
Definition: gpu_shader.cc:54
EvaluationStage stage
Definition: deg_eval.cc:89
GPUShader * immGetShader()
ccl_device_inline float3 log(float3 v)
Definition: math_float3.h:397
static void error(const char *str)
Definition: meshlaplacian.c:51
static GPUContext * wrap(Context *ctx)
static Context * unwrap(GPUContext *ctx)
Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correc...