51 shader_program_ = glCreateProgram();
63 glDeleteShader(vert_shader_);
64 glDeleteShader(geom_shader_);
65 glDeleteShader(frag_shader_);
66 glDeleteProgram(shader_program_);
75 char *GLShader::glsl_patch_get()
78 static char patch[512] =
"\0";
79 if (patch[0] !=
'\0') {
90 STR_CONCAT(patch, slen,
"#extension GL_ARB_texture_gather: enable\n");
93 STR_CONCAT(patch, slen,
"#ifdef GL_ARB_texture_gather\n");
94 STR_CONCAT(patch, slen,
"# define GPU_ARB_texture_gather\n");
98 STR_CONCAT(patch, slen,
"#extension GL_ARB_shader_draw_parameters : enable\n");
99 STR_CONCAT(patch, slen,
"#define GPU_ARB_shader_draw_parameters\n");
102 STR_CONCAT(patch, slen,
"#extension GL_ARB_texture_cube_map_array : enable\n");
103 STR_CONCAT(patch, slen,
"#define GPU_ARB_texture_cube_map_array\n");
117 GLuint
shader = glCreateShader(gl_stage);
119 fprintf(stderr,
"GLShader: Error: Could not create shader object.");
124 sources[0] = glsl_patch_get();
130 glGetShaderiv(
shader, GL_COMPILE_STATUS, &status);
134 if (
log[0] !=
'\0') {
136 case GL_VERTEX_SHADER:
139 case GL_GEOMETRY_SHADER:
142 case GL_FRAGMENT_SHADER:
150 compilation_failed_ =
true;
156 glAttachShader(shader_program_,
shader);
162 vert_shader_ = this->create_shader_stage(GL_VERTEX_SHADER, sources);
167 geom_shader_ = this->create_shader_stage(GL_GEOMETRY_SHADER, sources);
172 frag_shader_ = this->create_shader_stage(GL_FRAGMENT_SHADER, sources);
177 if (compilation_failed_) {
181 glLinkProgram(shader_program_);
184 glGetProgramiv(shader_program_, GL_LINK_STATUS, &status);
187 glGetProgramInfoLog(shader_program_,
sizeof(
log),
nullptr,
log);
207 glUseProgram(shader_program_);
229 glTransformFeedbackVaryings(
230 shader_program_, name_list.
size(), name_list.
data(), GL_INTERLEAVED_ATTRIBS);
231 transform_feedback_type_ = geom_type;
244 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf->vbo_id_);
246 switch (transform_feedback_type_) {
248 glBeginTransformFeedback(GL_POINTS);
251 glBeginTransformFeedback(GL_LINES);
254 glBeginTransformFeedback(GL_TRIANGLES);
264 glEndTransformFeedback();
277 glUniform1fv(location, array_size,
data);
280 glUniform2fv(location, array_size,
data);
283 glUniform3fv(location, array_size,
data);
286 glUniform4fv(location, array_size,
data);
289 glUniformMatrix3fv(location, array_size, 0,
data);
292 glUniformMatrix4fv(location, array_size, 0,
data);
304 glUniform1iv(location, array_size,
data);
307 glUniform2iv(location, array_size,
data);
310 glUniform3iv(location, array_size,
data);
313 glUniform4iv(location, array_size,
data);
332 case GL_UNSIGNED_INT_VEC2:
336 case GL_UNSIGNED_INT_VEC3:
341 case GL_UNSIGNED_INT_VEC4:
347 case GL_FLOAT_MAT2x3:
348 case GL_FLOAT_MAT3x2:
350 case GL_FLOAT_MAT2x4:
351 case GL_FLOAT_MAT4x2:
353 case GL_FLOAT_MAT3x4:
354 case GL_FLOAT_MAT4x3:
373 case GL_FLOAT_MAT2x3:
374 case GL_FLOAT_MAT2x4:
375 case GL_FLOAT_MAT3x2:
376 case GL_FLOAT_MAT3x4:
377 case GL_FLOAT_MAT4x2:
378 case GL_FLOAT_MAT4x3:
389 case GL_UNSIGNED_INT:
390 case GL_UNSIGNED_INT_VEC2:
391 case GL_UNSIGNED_INT_VEC3:
392 case GL_UNSIGNED_INT_VEC4:
406 glGetProgramiv(shader_program_, GL_ACTIVE_ATTRIBUTES, &attr_len);
408 for (
int i = 0; i < attr_len; i++) {
412 glGetActiveAttrib(shader_program_, i,
sizeof(
name),
nullptr, &
size, &gl_type,
name);
415 if (glGetAttribLocation(shader_program_,
name) == -1) {
431 return (
int)this->shader_program_;
KDTree *BLI_kdtree_nd_() new(unsigned int maxsize)
#define STR_CONCATF(dst, len, format,...)
#define STR_CONCAT(dst, len, suffix)
@ GPU_SHADER_TFB_TRIANGLES
struct GPUVertBuf GPUVertBuf
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr int64_t size() const
constexpr T * data() const
constexpr const T * data() const
constexpr int64_t size() const
static bool shader_draw_parameters_support
static float derivative_signs[2]
static bool texture_gather_support
static bool texture_cube_map_array_support
void transform_feedback_disable(void) override
bool finalize(void) override
void unbind(void) override
void fragment_shader_from_glsl(MutableSpan< const char * > sources) override
void uniform_float(int location, int comp_len, int array_size, const float *data) override
bool transform_feedback_enable(GPUVertBuf *buf) override
GLShader(const char *name)
int program_handle_get(void) const override
void transform_feedback_names_set(Span< const char * > name_list, const eGPUShaderTFBType geom_type) override
void vertformat_from_shader(GPUVertFormat *format) const override
void uniform_int(int location, int comp_len, int array_size, const int *data) override
void geometry_shader_from_glsl(MutableSpan< const char * > sources) override
void vertex_shader_from_glsl(MutableSpan< const char * > sources) override
void print_log(Span< const char * > sources, char *log, const char *stage, const bool error)
static uint calc_component_size(const GLenum gl_type)
static void get_fetch_mode_and_comp_type(int gl_type, GPUVertCompType *r_comp_type, GPUVertFetchMode *r_fetch_mode)
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
INLINE Rall1d< T, V, S > log(const Rall1d< T, V, S > &arg)
void object_label(GLenum type, GLuint object, const char *name)
static Context * unwrap(GPUContext *ctx)