Blender  V3.3
gl_shader.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. All rights reserved. */
3 
8 #pragma once
9 
10 #include "MEM_guardedalloc.h"
11 
12 #include "glew-mx.h"
13 
15 #include "gpu_shader_private.hh"
16 
17 namespace blender {
18 namespace gpu {
19 
23 class GLShader : public Shader {
26 
27  private:
29  GLuint shader_program_ = 0;
31  GLuint vert_shader_ = 0;
32  GLuint geom_shader_ = 0;
33  GLuint frag_shader_ = 0;
34  GLuint compute_shader_ = 0;
36  bool compilation_failed_ = false;
37 
38  eGPUShaderTFBType transform_feedback_type_ = GPU_SHADER_TFB_NONE;
39 
40  public:
41  GLShader(const char *name);
42  ~GLShader();
43 
49  bool finalize(const shader::ShaderCreateInfo *info = nullptr) override;
50 
51  std::string resources_declare(const shader::ShaderCreateInfo &info) const override;
52  std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const override;
53  std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override;
54  std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override;
55  std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const override;
56  std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override;
57 
60  eGPUShaderTFBType geom_type) override;
61  bool transform_feedback_enable(GPUVertBuf *buf) override;
62  void transform_feedback_disable() override;
63 
64  void bind() override;
65  void unbind() override;
66 
67  void uniform_float(int location, int comp_len, int array_size, const float *data) override;
68  void uniform_int(int location, int comp_len, int array_size, const int *data) override;
69 
70  void vertformat_from_shader(GPUVertFormat *format) const override;
71 
73  int program_handle_get() const override;
74 
75  bool is_compute() const
76  {
77  return compute_shader_ != 0;
78  }
79 
80  private:
81  char *glsl_patch_get(GLenum gl_stage);
82 
84  GLuint create_shader_stage(GLenum gl_stage, MutableSpan<const char *> sources);
85 
90  std::string workaround_geometry_shader_source_create(const shader::ShaderCreateInfo &info);
91 
92  bool do_geometry_shader_injection(const shader::ShaderCreateInfo *info);
93 
94  MEM_CXX_CLASS_ALLOC_FUNCS("GLShader");
95 };
96 
97 class GLLogParser : public GPULogParser {
98  public:
99  char *parse_line(char *log_line, GPULogItem &log_item) override;
100 
101  protected:
102  char *skip_severity_prefix(char *log_line, GPULogItem &log_item);
103  char *skip_severity_keyword(char *log_line, GPULogItem &log_item);
104 
106 };
107 
108 } // namespace gpu
109 } // namespace blender
eGPUShaderTFBType
Definition: GPU_shader.h:22
@ GPU_SHADER_TFB_NONE
Definition: GPU_shader.h:23
struct GPUVertBuf GPUVertBuf
Read Guarded memory(de)allocation.
char * parse_line(char *log_line, GPULogItem &log_item) override
char * skip_severity_prefix(char *log_line, GPULogItem &log_item)
char * skip_severity_keyword(char *log_line, GPULogItem &log_item)
MEM_CXX_CLASS_ALLOC_FUNCS("GLLogParser")
bool is_compute() const
Definition: gl_shader.hh:75
std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const override
Definition: gl_shader.cc:643
std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const override
Definition: gl_shader.cc:518
std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override
Definition: gl_shader.cc:678
void fragment_shader_from_glsl(MutableSpan< const char * > sources) override
Definition: gl_shader.cc:964
void unbind() override
Definition: gl_shader.cc:1023
void uniform_float(int location, int comp_len, int array_size, const float *data) override
Definition: gl_shader.cc:1085
void transform_feedback_names_set(Span< const char * > name_list, eGPUShaderTFBType geom_type) override
Definition: gl_shader.cc:1038
bool transform_feedback_enable(GPUVertBuf *buf) override
Definition: gl_shader.cc:1046
GLShader(const char *name)
Definition: gl_shader.cc:32
void bind() override
Definition: gl_shader.cc:1017
void compute_shader_from_glsl(MutableSpan< const char * > sources) override
Definition: gl_shader.cc:969
std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override
Definition: gl_shader.cc:700
int program_handle_get() const override
Definition: gl_shader.cc:1241
std::string resources_declare(const shader::ShaderCreateInfo &info) const override
Definition: gl_shader.cc:459
void vertformat_from_shader(GPUVertFormat *format) const override
Definition: gl_shader.cc:1213
void uniform_int(int location, int comp_len, int array_size, const int *data) override
Definition: gl_shader.cc:1112
std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override
Definition: gl_shader.cc:565
bool finalize(const shader::ShaderCreateInfo *info=nullptr) override
Definition: gl_shader.cc:974
void geometry_shader_from_glsl(MutableSpan< const char * > sources) override
Definition: gl_shader.cc:959
void vertex_shader_from_glsl(MutableSpan< const char * > sources) override
Definition: gl_shader.cc:954
void transform_feedback_disable() override
Definition: gl_shader.cc:1074
format
Definition: logImageCore.h:38
Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correc...