Blender V4.3
GPU_shader.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#pragma once
12
13#include "BLI_span.hh"
14#include "BLI_vector.hh"
15#include "GPU_common_types.hh"
16#include "GPU_shader_builtin.hh"
17
18namespace blender::gpu {
19class VertBuf;
20}
21
23struct GPUShaderCreateInfo;
25struct GPUShader;
26
27/* Hardware limit is 16. Position attribute is always needed so we reduce to 15.
28 * This makes sure the GPUVertexFormat name buffer does not overflow. */
29#define GPU_MAX_ATTR 15
30
31/* Determined by the maximum uniform buffer size divided by chunk size. */
32#define GPU_MAX_UNIFORM_ATTR 8
33
34/* -------------------------------------------------------------------- */
42GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info);
43
50GPUShader *GPU_shader_create_from_info_name(const char *info_name);
51
57const GPUShaderCreateInfo *GPU_shader_create_info_get(const char *info_name);
58
59void GPU_shader_create_info_get_unfinalized_copy(const char *info_name,
60 GPUShaderCreateInfo &r_info);
61
66bool GPU_shader_create_info_check_error(const GPUShaderCreateInfo *_info, char r_error[128]);
67
90
93/* -------------------------------------------------------------------- */
97void GPU_shader_free(GPUShader *shader);
98
101/* -------------------------------------------------------------------- */
112void GPU_shader_bind(GPUShader *shader);
113
119void GPU_shader_unbind();
120
126
129/* -------------------------------------------------------------------- */
133const char *GPU_shader_get_name(GPUShader *shader);
134
137/* -------------------------------------------------------------------- */
145int GPU_shader_get_ubo_binding(GPUShader *shader, const char *name);
146int GPU_shader_get_ssbo_binding(GPUShader *shader, const char *name);
147int GPU_shader_get_sampler_binding(GPUShader *shader, const char *name);
148
153int GPU_shader_get_uniform(GPUShader *shader, const char *name);
154
158int GPU_shader_get_constant(GPUShader *shader, const char *name);
159
165 GPUShader *shader, int location, int length, int array_size, const float *value);
167 GPUShader *shader, int location, int length, int array_size, const int *value);
168
175void GPU_shader_uniform_1i(GPUShader *sh, const char *name, int value);
176void GPU_shader_uniform_1b(GPUShader *sh, const char *name, bool value);
177void GPU_shader_uniform_1f(GPUShader *sh, const char *name, float value);
178void GPU_shader_uniform_2f(GPUShader *sh, const char *name, float x, float y);
179void GPU_shader_uniform_3f(GPUShader *sh, const char *name, float x, float y, float z);
180void GPU_shader_uniform_4f(GPUShader *sh, const char *name, float x, float y, float z, float w);
181void GPU_shader_uniform_2fv(GPUShader *sh, const char *name, const float data[2]);
182void GPU_shader_uniform_3fv(GPUShader *sh, const char *name, const float data[3]);
183void GPU_shader_uniform_4fv(GPUShader *sh, const char *name, const float data[4]);
184void GPU_shader_uniform_2iv(GPUShader *sh, const char *name, const int data[2]);
185void GPU_shader_uniform_mat4(GPUShader *sh, const char *name, const float data[4][4]);
186void GPU_shader_uniform_mat3_as_mat4(GPUShader *sh, const char *name, const float data[3][3]);
187void GPU_shader_uniform_1f_array(GPUShader *sh, const char *name, int len, const float *val);
188void GPU_shader_uniform_2fv_array(GPUShader *sh, const char *name, int len, const float (*val)[2]);
189void GPU_shader_uniform_4fv_array(GPUShader *sh, const char *name, int len, const float (*val)[4]);
190
193/* -------------------------------------------------------------------- */
199unsigned int GPU_shader_get_attribute_len(const GPUShader *shader);
200int GPU_shader_get_attribute(const GPUShader *shader, const char *name);
202 int attr_location,
203 char r_name[256],
204 int *r_type);
205
208/* -------------------------------------------------------------------- */
216void GPU_shader_constant_int_ex(GPUShader *sh, int location, int value);
217void GPU_shader_constant_uint_ex(GPUShader *sh, int location, unsigned int value);
218void GPU_shader_constant_float_ex(GPUShader *sh, int location, float value);
219void GPU_shader_constant_bool_ex(GPUShader *sh, int location, bool value);
220
221void GPU_shader_constant_int(GPUShader *sh, const char *name, int value);
222void GPU_shader_constant_uint(GPUShader *sh, const char *name, unsigned int value);
223void GPU_shader_constant_float(GPUShader *sh, const char *name, float value);
224void GPU_shader_constant_bool(GPUShader *sh, const char *name, bool value);
225
227
232
246
253
256/* -------------------------------------------------------------------- */
268
269GPUShader *GPU_shader_create(const char *vertcode,
270 const char *fragcode,
271 const char *geomcode,
272 const char *libcode,
273 const char *defines,
274 const char *shname);
275GPUShader *GPU_shader_create_compute(const char *computecode,
276 const char *libcode,
277 const char *defines,
278 const char *shname);
279GPUShader *GPU_shader_create_from_python(const char *vertcode,
280 const char *fragcode,
281 const char *geomcode,
282 const char *libcode,
283 const char *defines,
284 const char *name);
285GPUShader *GPU_shader_create_ex(const char *vertcode,
286 const char *fragcode,
287 const char *geomcode,
288 const char *computecode,
289 const char *libcode,
290 const char *defines,
291 eGPUShaderTFBType tf_type,
292 const char **tf_names,
293 int tf_count,
294 const char *shname);
295
301
309
345void GPU_shader_warm_cache(GPUShader *shader, int limit);
346
347/* We expect the parent shader to be compiled and already have some cached PSOs when being assigned
348 * as a reference. Ensure the parent shader still exists when `GPU_shader_cache_warm(..)` is
349 * called. */
350void GPU_shader_set_parent(GPUShader *shader, GPUShader *parent);
351
354
359 GPU_UNIFORM_MODEL = 0, /* mat4 ModelMatrix */
360 GPU_UNIFORM_VIEW, /* mat4 ViewMatrix */
361 GPU_UNIFORM_MODELVIEW, /* mat4 ModelViewMatrix */
362 GPU_UNIFORM_PROJECTION, /* mat4 ProjectionMatrix */
363 GPU_UNIFORM_VIEWPROJECTION, /* mat4 ViewProjectionMatrix */
364 GPU_UNIFORM_MVP, /* mat4 ModelViewProjectionMatrix */
365
366 GPU_UNIFORM_MODEL_INV, /* mat4 ModelMatrixInverse */
367 GPU_UNIFORM_VIEW_INV, /* mat4 ViewMatrixInverse */
368 GPU_UNIFORM_MODELVIEW_INV, /* mat4 ModelViewMatrixInverse */
369 GPU_UNIFORM_PROJECTION_INV, /* mat4 ProjectionMatrixInverse */
370 GPU_UNIFORM_VIEWPROJECTION_INV, /* mat4 ViewProjectionMatrixInverse */
371
372 GPU_UNIFORM_NORMAL, /* mat3 NormalMatrix */
373 GPU_UNIFORM_ORCO, /* vec4 OrcoTexCoFactors[] */
374 GPU_UNIFORM_CLIPPLANES, /* vec4 WorldClipPlanes[] */
375
376 GPU_UNIFORM_COLOR, /* vec4 color */
377 GPU_UNIFORM_BASE_INSTANCE, /* int baseInstance */
378 GPU_UNIFORM_RESOURCE_CHUNK, /* int resourceChunk */
379 GPU_UNIFORM_RESOURCE_ID, /* int resourceId */
380 GPU_UNIFORM_SRGB_TRANSFORM, /* bool srgbTarget */
381};
382#define GPU_NUM_UNIFORMS (GPU_UNIFORM_SRGB_TRANSFORM + 1)
383
388int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin);
389
396
398
412
414int GPU_shader_get_builtin_block(GPUShader *shader, int builtin);
415
417int GPU_shader_get_uniform_block(GPUShader *shader, const char *name);
418
int GPU_shader_get_sampler_binding(GPUShader *shader, const char *name)
int GPU_shader_get_uniform(GPUShader *shader, const char *name)
void GPU_shader_constant_int(GPUShader *sh, const char *name, int value)
GPUShader * GPU_shader_create(const char *vertcode, const char *fragcode, const char *geomcode, const char *libcode, const char *defines, const char *shname)
void GPU_shader_uniform_2fv(GPUShader *sh, const char *name, const float data[2])
bool GPU_shader_get_attribute_info(const GPUShader *shader, int attr_location, char r_name[256], int *r_type)
const char * GPU_shader_get_name(GPUShader *shader)
void GPU_shader_uniform_1i(GPUShader *sh, const char *name, int value)
int GPU_shader_get_ubo_binding(GPUShader *shader, const char *name)
void GPU_shader_uniform_3f(GPUShader *sh, const char *name, float x, float y, float z)
blender::Vector< GPUShader * > GPU_shader_batch_finalize(BatchHandle &handle)
void GPU_shader_uniform_2f(GPUShader *sh, const char *name, float x, float y)
void GPU_shader_uniform_2fv_array(GPUShader *sh, const char *name, int len, const float(*val)[2])
void GPU_shader_uniform_int_ex(GPUShader *shader, int location, int length, int array_size, const int *value)
SpecializationBatchHandle GPU_shader_batch_specializations(blender::Span< ShaderSpecialization > specializations)
GPUShader * GPU_shader_create_from_info_name(const char *info_name)
int GPU_shader_get_ssbo_vertex_fetch_num_verts_per_prim(GPUShader *shader)
bool GPU_shader_uses_ssbo_vertex_fetch(GPUShader *shader)
void GPU_shader_cache_dir_clear_old()
void GPU_shader_uniform_1f(GPUShader *sh, const char *name, float value)
GPUShader * GPU_shader_create_from_python(const char *vertcode, const char *fragcode, const char *geomcode, const char *libcode, const char *defines, const char *name)
void GPU_shader_uniform_mat3_as_mat4(GPUShader *sh, const char *name, const float data[3][3])
void GPU_shader_uniform_3fv(GPUShader *sh, const char *name, const float data[3])
void GPU_shader_constant_uint(GPUShader *sh, const char *name, unsigned int value)
void GPU_shader_uniform_1f_array(GPUShader *sh, const char *name, int len, const float *val)
int GPU_shader_get_ssbo_binding(GPUShader *shader, const char *name)
unsigned int GPU_shader_get_attribute_len(const GPUShader *shader)
int GPU_shader_get_attribute(const GPUShader *shader, const char *name)
bool GPU_shader_transform_feedback_enable(GPUShader *shader, blender::gpu::VertBuf *vertbuf)
void GPU_shader_uniform_2iv(GPUShader *sh, const char *name, const int data[2])
void GPU_shader_uniform_4fv_array(GPUShader *sh, const char *name, int len, const float(*val)[4])
void GPU_shader_constant_bool_ex(GPUShader *sh, int location, bool value)
int64_t BatchHandle
Definition GPU_shader.hh:68
void GPU_shader_constant_int_ex(GPUShader *sh, int location, int value)
void GPU_shader_set_parent(GPUShader *shader, GPUShader *parent)
bool GPU_shader_batch_is_ready(BatchHandle handle)
int GPU_shader_get_builtin_block(GPUShader *shader, int builtin)
void GPU_shader_uniform_float_ex(GPUShader *shader, int location, int length, int array_size, const float *value)
eGPUShaderTFBType
@ GPU_SHADER_TFB_TRIANGLES
@ GPU_SHADER_TFB_NONE
@ GPU_SHADER_TFB_LINES
@ GPU_SHADER_TFB_POINTS
const GPUShaderCreateInfo * GPU_shader_create_info_get(const char *info_name)
void GPU_shader_transform_feedback_disable(GPUShader *shader)
int GPU_shader_get_program(GPUShader *shader)
void GPU_shader_bind(GPUShader *shader)
void GPU_shader_constant_float_ex(GPUShader *sh, int location, float value)
void GPU_shader_uniform_1b(GPUShader *sh, const char *name, bool value)
GPUUniformBuiltin
@ GPU_UNIFORM_VIEWPROJECTION_INV
@ GPU_UNIFORM_PROJECTION
@ GPU_UNIFORM_RESOURCE_ID
@ GPU_UNIFORM_ORCO
@ GPU_UNIFORM_VIEWPROJECTION
@ GPU_UNIFORM_SRGB_TRANSFORM
@ GPU_UNIFORM_VIEW
@ GPU_UNIFORM_MODEL
@ GPU_UNIFORM_MODELVIEW
@ GPU_UNIFORM_BASE_INSTANCE
@ GPU_UNIFORM_VIEW_INV
@ GPU_UNIFORM_MODEL_INV
@ GPU_UNIFORM_PROJECTION_INV
@ GPU_UNIFORM_CLIPPLANES
@ GPU_UNIFORM_COLOR
@ GPU_UNIFORM_MODELVIEW_INV
@ GPU_UNIFORM_NORMAL
@ GPU_UNIFORM_RESOURCE_CHUNK
@ GPU_UNIFORM_MVP
GPUShader * GPU_shader_create_from_info(const GPUShaderCreateInfo *_info)
void GPU_shader_uniform_4fv(GPUShader *sh, const char *name, const float data[4])
void GPU_shader_uniform_4f(GPUShader *sh, const char *name, float x, float y, float z, float w)
void GPU_shader_constant_uint_ex(GPUShader *sh, int location, unsigned int value)
int GPU_shader_get_uniform_block(GPUShader *shader, const char *name)
int64_t SpecializationBatchHandle
BatchHandle GPU_shader_batch_create_from_infos(blender::Span< const GPUShaderCreateInfo * > infos)
void GPU_shader_uniform_mat4(GPUShader *sh, const char *name, const float data[4][4])
int GPU_shader_get_constant(GPUShader *shader, const char *name)
void GPU_shader_constant_bool(GPUShader *sh, const char *name, bool value)
int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin)
void GPU_shader_free(GPUShader *shader)
GPUShader * GPU_shader_create_compute(const char *computecode, const char *libcode, const char *defines, const char *shname)
bool GPU_shader_create_info_check_error(const GPUShaderCreateInfo *_info, char r_error[128])
void GPU_shader_unbind()
void GPU_shader_create_info_get_unfinalized_copy(const char *info_name, GPUShaderCreateInfo &r_info)
GPUShader * GPU_shader_create_ex(const char *vertcode, const char *fragcode, const char *geomcode, const char *computecode, const char *libcode, const char *defines, eGPUShaderTFBType tf_type, const char **tf_names, int tf_count, const char *shname)
GPUShader * GPU_shader_get_bound()
void GPU_shader_warm_cache(GPUShader *shader, int limit)
GPUUniformBlockBuiltin
@ GPU_UNIFORM_BLOCK_DRW_VIEW
@ GPU_UNIFORM_BLOCK_DRW_MODEL
@ GPU_NUM_UNIFORM_BLOCKS
@ GPU_UNIFORM_BLOCK_MODEL
@ GPU_UNIFORM_BLOCK_VIEW
@ GPU_UNIFORM_BLOCK_DRW_CLIPPING
@ GPU_UNIFORM_BLOCK_DRW_INFOS
@ GPU_UNIFORM_BLOCK_INFO
bool GPU_shader_batch_specializations_is_ready(SpecializationBatchHandle &handle)
void GPU_shader_constant_float(GPUShader *sh, const char *name, float value)
void GPU_shader_compile_static()
struct GPUShader GPUShader
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
int len
__int64 int64_t
Definition stdint.h:89
blender::Vector< blender::gpu::shader::SpecializationConstant > constants