Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/drivers/gles3/storage/material_storage.h
21680 views
1
/**************************************************************************/
2
/* material_storage.h */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#pragma once
32
33
#ifdef GLES3_ENABLED
34
35
#include "core/templates/rid_owner.h"
36
#include "core/templates/self_list.h"
37
#include "servers/rendering/shader_compiler.h"
38
#include "servers/rendering/shader_language.h"
39
#include "servers/rendering/storage/material_storage.h"
40
#include "servers/rendering/storage/utilities.h"
41
42
#include "drivers/gles3/shaders/canvas.glsl.gen.h"
43
#include "drivers/gles3/shaders/particles.glsl.gen.h"
44
#include "drivers/gles3/shaders/scene.glsl.gen.h"
45
#include "drivers/gles3/shaders/sky.glsl.gen.h"
46
#include "drivers/gles3/shaders/tex_blit.glsl.gen.h"
47
48
namespace GLES3 {
49
50
/* Shader Structs */
51
52
struct ShaderData {
53
String path;
54
HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms;
55
HashMap<StringName, HashMap<int, RID>> default_texture_params;
56
57
virtual void set_path_hint(const String &p_hint);
58
virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index);
59
virtual Variant get_default_parameter(const StringName &p_parameter) const;
60
virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const;
61
virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const;
62
virtual bool is_parameter_texture(const StringName &p_param) const;
63
64
virtual void set_code(const String &p_Code) = 0;
65
virtual bool is_animated() const = 0;
66
virtual bool casts_shadows() const = 0;
67
virtual RS::ShaderNativeSourceCode get_native_source_code() const { return RS::ShaderNativeSourceCode(); }
68
69
virtual ~ShaderData() {}
70
};
71
72
typedef ShaderData *(*ShaderDataRequestFunction)();
73
74
struct Material;
75
76
struct Shader {
77
ShaderData *data = nullptr;
78
String code;
79
String path_hint;
80
RS::ShaderMode mode;
81
HashMap<StringName, HashMap<int, RID>> default_texture_parameter;
82
HashSet<Material *> owners;
83
};
84
85
/* Material structs */
86
87
struct MaterialData {
88
void update_uniform_buffer(const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const HashMap<StringName, Variant> &p_parameters, uint8_t *p_buffer, uint32_t p_buffer_size);
89
void update_textures(const HashMap<StringName, Variant> &p_parameters, const HashMap<StringName, HashMap<int, RID>> &p_default_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_use_linear_color);
90
91
virtual void set_render_priority(int p_priority) = 0;
92
virtual void set_next_pass(RID p_pass) = 0;
93
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) = 0;
94
virtual void bind_uniforms() = 0;
95
virtual ~MaterialData();
96
97
// Used internally by all Materials
98
void update_parameters_internal(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty, const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, const HashMap<StringName, HashMap<int, RID>> &p_default_texture_params, uint32_t p_ubo_size, bool p_is_3d_shader_type);
99
100
protected:
101
Vector<uint8_t> ubo_data;
102
GLuint uniform_buffer = GLuint(0);
103
Vector<RID> texture_cache;
104
105
private:
106
friend class MaterialStorage;
107
RID self;
108
List<RID>::Element *global_buffer_E = nullptr;
109
List<RID>::Element *global_texture_E = nullptr;
110
uint64_t global_textures_pass = 0;
111
HashMap<StringName, uint64_t> used_global_textures;
112
};
113
114
typedef MaterialData *(*MaterialDataRequestFunction)(ShaderData *);
115
116
struct Material {
117
RID self;
118
MaterialData *data = nullptr;
119
Shader *shader = nullptr;
120
//shortcut to shader data and type
121
RS::ShaderMode shader_mode = RS::SHADER_MAX;
122
uint32_t shader_id = 0;
123
bool uniform_dirty = false;
124
bool texture_dirty = false;
125
HashMap<StringName, Variant> params;
126
int32_t priority = 0;
127
RID next_pass;
128
SelfList<Material> update_element;
129
130
Dependency dependency;
131
132
Material() :
133
update_element(this) {}
134
};
135
136
/* CanvasItem Materials */
137
138
struct CanvasShaderData : public ShaderData {
139
enum BlendMode { // Used internally.
140
BLEND_MODE_MIX,
141
BLEND_MODE_ADD,
142
BLEND_MODE_SUB,
143
BLEND_MODE_MUL,
144
BLEND_MODE_PMALPHA,
145
BLEND_MODE_DISABLED,
146
BLEND_MODE_LCD,
147
};
148
149
// All these members are (re)initialized in `set_code`.
150
// Make sure to add the init to `set_code` whenever adding new members.
151
152
bool valid;
153
RID version;
154
155
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
156
157
Vector<uint32_t> ubo_offsets;
158
uint32_t ubo_size;
159
160
String code;
161
162
BlendMode blend_mode;
163
164
bool uses_screen_texture;
165
bool uses_screen_texture_mipmaps;
166
bool uses_sdf;
167
bool uses_time;
168
bool uses_custom0;
169
bool uses_custom1;
170
171
uint64_t vertex_input_mask;
172
173
virtual void set_code(const String &p_Code);
174
virtual bool is_animated() const;
175
virtual bool casts_shadows() const;
176
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
177
178
CanvasShaderData();
179
virtual ~CanvasShaderData();
180
};
181
182
ShaderData *_create_canvas_shader_func();
183
184
struct CanvasMaterialData : public MaterialData {
185
CanvasShaderData *shader_data = nullptr;
186
187
virtual void set_render_priority(int p_priority) {}
188
virtual void set_next_pass(RID p_pass) {}
189
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
190
virtual void bind_uniforms();
191
virtual ~CanvasMaterialData();
192
};
193
194
MaterialData *_create_canvas_material_func(ShaderData *p_shader);
195
196
/* Sky Materials */
197
198
struct SkyShaderData : public ShaderData {
199
// All these members are (re)initialized in `set_code`.
200
// Make sure to add the init to `set_code` whenever adding new members.
201
202
bool valid;
203
RID version;
204
205
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
206
207
Vector<uint32_t> ubo_offsets;
208
uint32_t ubo_size;
209
210
String code;
211
212
bool uses_time;
213
bool uses_position;
214
bool uses_half_res;
215
bool uses_quarter_res;
216
bool uses_light;
217
218
virtual void set_code(const String &p_Code);
219
virtual bool is_animated() const;
220
virtual bool casts_shadows() const;
221
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
222
SkyShaderData();
223
virtual ~SkyShaderData();
224
};
225
226
ShaderData *_create_sky_shader_func();
227
228
struct SkyMaterialData : public MaterialData {
229
SkyShaderData *shader_data = nullptr;
230
bool uniform_set_updated = false;
231
232
virtual void set_render_priority(int p_priority) {}
233
virtual void set_next_pass(RID p_pass) {}
234
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
235
virtual void bind_uniforms();
236
virtual ~SkyMaterialData();
237
};
238
239
MaterialData *_create_sky_material_func(ShaderData *p_shader);
240
241
/* Scene Materials */
242
243
struct SceneShaderData : public ShaderData {
244
enum BlendMode { // Used internally.
245
BLEND_MODE_MIX,
246
BLEND_MODE_ADD,
247
BLEND_MODE_SUB,
248
BLEND_MODE_MUL,
249
BLEND_MODE_PREMULT_ALPHA,
250
BLEND_MODE_ALPHA_TO_COVERAGE
251
};
252
253
enum DepthDraw {
254
DEPTH_DRAW_DISABLED,
255
DEPTH_DRAW_OPAQUE,
256
DEPTH_DRAW_ALWAYS
257
};
258
259
enum DepthTest {
260
DEPTH_TEST_DISABLED,
261
DEPTH_TEST_ENABLED,
262
DEPTH_TEST_ENABLED_INVERTED,
263
};
264
265
enum StencilCompare {
266
STENCIL_COMPARE_LESS,
267
STENCIL_COMPARE_EQUAL,
268
STENCIL_COMPARE_LESS_OR_EQUAL,
269
STENCIL_COMPARE_GREATER,
270
STENCIL_COMPARE_NOT_EQUAL,
271
STENCIL_COMPARE_GREATER_OR_EQUAL,
272
STENCIL_COMPARE_ALWAYS,
273
STENCIL_COMPARE_MAX // not an actual operator, just the amount of operators
274
};
275
276
enum StencilFlags {
277
STENCIL_FLAG_READ = 1,
278
STENCIL_FLAG_WRITE = 2,
279
STENCIL_FLAG_WRITE_DEPTH_FAIL = 4,
280
};
281
282
enum AlphaAntiAliasing {
283
ALPHA_ANTIALIASING_OFF,
284
ALPHA_ANTIALIASING_ALPHA_TO_COVERAGE,
285
ALPHA_ANTIALIASING_ALPHA_TO_COVERAGE_AND_TO_ONE
286
};
287
288
// All these members are (re)initialized in `set_code`.
289
// Make sure to add the init to `set_code` whenever adding new members.
290
291
bool valid;
292
RID version;
293
294
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
295
296
Vector<uint32_t> ubo_offsets;
297
uint32_t ubo_size;
298
299
String code;
300
301
BlendMode blend_mode;
302
AlphaAntiAliasing alpha_antialiasing_mode;
303
DepthDraw depth_draw;
304
DepthTest depth_test;
305
RS::CullMode cull_mode;
306
307
StencilCompare stencil_compare;
308
uint32_t stencil_flags;
309
int32_t stencil_reference;
310
bool stencil_enabled;
311
312
bool uses_point_size;
313
bool uses_alpha;
314
bool uses_alpha_clip;
315
bool uses_blend_alpha;
316
bool uses_depth_prepass_alpha;
317
bool uses_discard;
318
bool uses_roughness;
319
bool uses_normal;
320
bool uses_particle_trails;
321
bool wireframe;
322
323
bool unshaded;
324
bool uses_vertex;
325
bool uses_position;
326
bool uses_sss;
327
bool uses_transmittance;
328
bool uses_screen_texture;
329
bool uses_screen_texture_mipmaps;
330
bool uses_depth_texture;
331
bool uses_normal_texture;
332
bool uses_bent_normal_texture;
333
bool uses_time;
334
bool uses_vertex_time;
335
bool uses_fragment_time;
336
bool writes_modelview_or_projection;
337
bool uses_world_coordinates;
338
bool uses_tangent;
339
bool uses_color;
340
bool uses_uv;
341
bool uses_uv2;
342
bool uses_custom0;
343
bool uses_custom1;
344
bool uses_custom2;
345
bool uses_custom3;
346
bool uses_bones;
347
bool uses_weights;
348
349
uint64_t vertex_input_mask;
350
351
virtual void set_code(const String &p_Code);
352
virtual bool is_animated() const;
353
virtual bool casts_shadows() const;
354
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
355
356
SceneShaderData();
357
virtual ~SceneShaderData();
358
};
359
360
ShaderData *_create_scene_shader_func();
361
362
struct SceneMaterialData : public MaterialData {
363
SceneShaderData *shader_data = nullptr;
364
uint64_t last_pass = 0;
365
uint32_t index = 0;
366
RID next_pass;
367
uint8_t priority = 0;
368
virtual void set_render_priority(int p_priority);
369
virtual void set_next_pass(RID p_pass);
370
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
371
virtual void bind_uniforms();
372
virtual ~SceneMaterialData();
373
};
374
375
MaterialData *_create_scene_material_func(ShaderData *p_shader);
376
377
/* Particle Shader */
378
379
enum {
380
PARTICLES_MAX_USERDATAS = 6
381
};
382
383
struct ParticlesShaderData : public ShaderData {
384
// All these members are (re)initialized in `set_code`.
385
// Make sure to add the init to `set_code` whenever adding new members.
386
387
bool valid;
388
RID version;
389
390
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
391
392
Vector<uint32_t> ubo_offsets;
393
uint32_t ubo_size;
394
395
String code;
396
397
bool uses_collision;
398
bool uses_time;
399
400
bool userdatas_used[PARTICLES_MAX_USERDATAS] = {};
401
uint32_t userdata_count;
402
403
virtual void set_code(const String &p_Code);
404
virtual bool is_animated() const;
405
virtual bool casts_shadows() const;
406
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
407
408
ParticlesShaderData() {}
409
virtual ~ParticlesShaderData();
410
};
411
412
ShaderData *_create_particles_shader_func();
413
414
struct ParticleProcessMaterialData : public MaterialData {
415
ParticlesShaderData *shader_data = nullptr;
416
RID uniform_set;
417
418
virtual void set_render_priority(int p_priority) {}
419
virtual void set_next_pass(RID p_pass) {}
420
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
421
virtual void bind_uniforms();
422
virtual ~ParticleProcessMaterialData();
423
};
424
425
MaterialData *_create_particles_material_func(ShaderData *p_shader);
426
427
/* Texture Blit Shader */
428
429
struct TexBlitShaderData : public ShaderData {
430
enum BlendMode { // Used internally.
431
BLEND_MODE_MIX,
432
BLEND_MODE_ADD,
433
BLEND_MODE_SUB,
434
BLEND_MODE_MUL,
435
BLEND_MODE_DISABLED,
436
};
437
438
bool valid;
439
RID version;
440
441
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
442
443
Vector<uint32_t> ubo_offsets;
444
uint32_t ubo_size;
445
446
String code;
447
448
BlendMode blend_mode;
449
450
virtual void set_code(const String &p_code);
451
virtual bool is_animated() const;
452
virtual bool casts_shadows() const;
453
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
454
455
TexBlitShaderData();
456
virtual ~TexBlitShaderData();
457
};
458
459
ShaderData *_create_tex_blit_shader_func();
460
461
struct TexBlitMaterialData : public MaterialData {
462
TexBlitShaderData *shader_data = nullptr;
463
464
virtual void set_render_priority(int p_priority) {}
465
virtual void set_next_pass(RID p_pass) {}
466
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
467
virtual void bind_uniforms();
468
virtual ~TexBlitMaterialData();
469
};
470
471
MaterialData *_create_tex_blit_material_func(ShaderData *p_shader);
472
473
/* Global shader uniform structs */
474
struct GlobalShaderUniforms {
475
enum {
476
BUFFER_DIRTY_REGION_SIZE = 1024
477
};
478
struct Variable {
479
HashSet<RID> texture_materials; // materials using this
480
481
RS::GlobalShaderParameterType type;
482
Variant value;
483
Variant override;
484
int32_t buffer_index; //for vectors
485
int32_t buffer_elements; //for vectors
486
};
487
488
HashMap<StringName, Variable> variables;
489
490
struct Value {
491
float x;
492
float y;
493
float z;
494
float w;
495
};
496
497
struct ValueInt {
498
int32_t x;
499
int32_t y;
500
int32_t z;
501
int32_t w;
502
};
503
504
struct ValueUInt {
505
uint32_t x;
506
uint32_t y;
507
uint32_t z;
508
uint32_t w;
509
};
510
511
struct ValueUsage {
512
uint32_t elements = 0;
513
};
514
515
List<RID> materials_using_buffer;
516
List<RID> materials_using_texture;
517
518
GLuint buffer = GLuint(0);
519
Value *buffer_values = nullptr;
520
ValueUsage *buffer_usage = nullptr;
521
bool *buffer_dirty_regions = nullptr;
522
uint32_t buffer_dirty_region_count = 0;
523
524
uint32_t buffer_size;
525
526
bool must_update_texture_materials = false;
527
bool must_update_buffer_materials = false;
528
529
HashMap<RID, int32_t> instance_buffer_pos;
530
};
531
532
class MaterialStorage : public RendererMaterialStorage {
533
private:
534
friend struct MaterialData;
535
static MaterialStorage *singleton;
536
537
/* GLOBAL SHADER UNIFORM API */
538
539
GlobalShaderUniforms global_shader_uniforms;
540
541
int32_t _global_shader_uniform_allocate(uint32_t p_elements);
542
void _global_shader_uniform_store_in_buffer(int32_t p_index, RS::GlobalShaderParameterType p_type, const Variant &p_value);
543
void _global_shader_uniform_mark_buffer_dirty(int32_t p_index, int32_t p_elements);
544
545
/* SHADER API */
546
547
ShaderDataRequestFunction shader_data_request_func[RS::SHADER_MAX];
548
mutable RID_Owner<Shader, true> shader_owner;
549
550
/* MATERIAL API */
551
MaterialDataRequestFunction material_data_request_func[RS::SHADER_MAX];
552
mutable RID_Owner<Material, true> material_owner;
553
554
SelfList<Material>::List material_update_list;
555
HashSet<RID> dummy_embedded_set;
556
557
public:
558
static MaterialStorage *get_singleton();
559
560
MaterialStorage();
561
virtual ~MaterialStorage();
562
563
static _FORCE_INLINE_ void store_transform(const Transform3D &p_mtx, float *p_array) {
564
p_array[0] = p_mtx.basis.rows[0][0];
565
p_array[1] = p_mtx.basis.rows[1][0];
566
p_array[2] = p_mtx.basis.rows[2][0];
567
p_array[3] = 0;
568
p_array[4] = p_mtx.basis.rows[0][1];
569
p_array[5] = p_mtx.basis.rows[1][1];
570
p_array[6] = p_mtx.basis.rows[2][1];
571
p_array[7] = 0;
572
p_array[8] = p_mtx.basis.rows[0][2];
573
p_array[9] = p_mtx.basis.rows[1][2];
574
p_array[10] = p_mtx.basis.rows[2][2];
575
p_array[11] = 0;
576
p_array[12] = p_mtx.origin.x;
577
p_array[13] = p_mtx.origin.y;
578
p_array[14] = p_mtx.origin.z;
579
p_array[15] = 1;
580
}
581
582
static _FORCE_INLINE_ void store_transform_3x3(const Basis &p_mtx, float *p_array) {
583
p_array[0] = p_mtx.rows[0][0];
584
p_array[1] = p_mtx.rows[1][0];
585
p_array[2] = p_mtx.rows[2][0];
586
p_array[3] = 0;
587
p_array[4] = p_mtx.rows[0][1];
588
p_array[5] = p_mtx.rows[1][1];
589
p_array[6] = p_mtx.rows[2][1];
590
p_array[7] = 0;
591
p_array[8] = p_mtx.rows[0][2];
592
p_array[9] = p_mtx.rows[1][2];
593
p_array[10] = p_mtx.rows[2][2];
594
p_array[11] = 0;
595
}
596
597
static _FORCE_INLINE_ void store_camera(const Projection &p_mtx, float *p_array) {
598
for (int i = 0; i < 4; i++) {
599
for (int j = 0; j < 4; j++) {
600
p_array[i * 4 + j] = p_mtx.columns[i][j];
601
}
602
}
603
}
604
605
struct Shaders {
606
CanvasShaderGLES3 canvas_shader;
607
SkyShaderGLES3 sky_shader;
608
SceneShaderGLES3 scene_shader;
609
ParticlesShaderGLES3 particles_process_shader;
610
TexBlitShaderGLES3 tex_blit_shader;
611
612
ShaderCompiler compiler_canvas;
613
ShaderCompiler compiler_scene;
614
ShaderCompiler compiler_particles;
615
ShaderCompiler compiler_sky;
616
ShaderCompiler compiler_tex_blit;
617
} shaders;
618
619
/* GLOBAL SHADER UNIFORM API */
620
621
void _update_global_shader_uniforms();
622
623
virtual void global_shader_parameter_add(const StringName &p_name, RS::GlobalShaderParameterType p_type, const Variant &p_value) override;
624
virtual void global_shader_parameter_remove(const StringName &p_name) override;
625
virtual Vector<StringName> global_shader_parameter_get_list() const override;
626
627
virtual void global_shader_parameter_set(const StringName &p_name, const Variant &p_value) override;
628
virtual void global_shader_parameter_set_override(const StringName &p_name, const Variant &p_value) override;
629
virtual Variant global_shader_parameter_get(const StringName &p_name) const override;
630
virtual RS::GlobalShaderParameterType global_shader_parameter_get_type(const StringName &p_name) const override;
631
RS::GlobalShaderParameterType global_shader_parameter_get_type_internal(const StringName &p_name) const;
632
633
virtual void global_shader_parameters_load_settings(bool p_load_textures = true) override;
634
virtual void global_shader_parameters_clear() override;
635
636
virtual int32_t global_shader_parameters_instance_allocate(RID p_instance) override;
637
virtual void global_shader_parameters_instance_free(RID p_instance) override;
638
virtual void global_shader_parameters_instance_update(RID p_instance, int p_index, const Variant &p_value, int p_flags_count = 0) override;
639
640
GLuint global_shader_parameters_get_uniform_buffer() const;
641
642
/* SHADER API */
643
644
Shader *get_shader(RID p_rid) { return shader_owner.get_or_null(p_rid); }
645
bool owns_shader(RID p_rid) { return shader_owner.owns(p_rid); }
646
647
void _shader_make_dirty(Shader *p_shader);
648
649
virtual RID shader_allocate() override;
650
virtual void shader_initialize(RID p_rid, bool p_embedded = true) override;
651
virtual void shader_free(RID p_rid) override;
652
653
virtual void shader_set_code(RID p_shader, const String &p_code) override;
654
virtual void shader_set_path_hint(RID p_shader, const String &p_path) override;
655
virtual String shader_get_code(RID p_shader) const override;
656
virtual void get_shader_parameter_list(RID p_shader, List<PropertyInfo> *p_param_list) const override;
657
658
virtual void shader_set_default_texture_parameter(RID p_shader, const StringName &p_name, RID p_texture, int p_index) override;
659
virtual RID shader_get_default_texture_parameter(RID p_shader, const StringName &p_name, int p_index) const override;
660
virtual Variant shader_get_parameter_default(RID p_shader, const StringName &p_name) const override;
661
662
virtual RS::ShaderNativeSourceCode shader_get_native_source_code(RID p_shader) const override;
663
virtual void shader_embedded_set_lock() override {}
664
virtual const HashSet<RID> &shader_embedded_set_get() const override { return dummy_embedded_set; }
665
virtual void shader_embedded_set_unlock() override {}
666
667
/* MATERIAL API */
668
669
Material *get_material(RID p_rid) { return material_owner.get_or_null(p_rid); }
670
bool owns_material(RID p_rid) { return material_owner.owns(p_rid); }
671
672
void _material_queue_update(Material *material, bool p_uniform, bool p_texture);
673
void _update_queued_materials();
674
675
virtual RID material_allocate() override;
676
virtual void material_initialize(RID p_rid) override;
677
virtual void material_free(RID p_rid) override;
678
679
virtual void material_set_shader(RID p_material, RID p_shader) override;
680
681
virtual void material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) override;
682
virtual Variant material_get_param(RID p_material, const StringName &p_param) const override;
683
684
virtual void material_set_next_pass(RID p_material, RID p_next_material) override;
685
virtual void material_set_render_priority(RID p_material, int priority) override;
686
687
virtual bool material_is_animated(RID p_material) override;
688
virtual bool material_casts_shadows(RID p_material) override;
689
virtual RS::CullMode material_get_cull_mode(RID p_material) const override;
690
691
virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override;
692
693
virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override;
694
695
_FORCE_INLINE_ uint32_t material_get_shader_id(RID p_material) {
696
Material *material = material_owner.get_or_null(p_material);
697
return material->shader_id;
698
}
699
700
_FORCE_INLINE_ MaterialData *material_get_data(RID p_material, RS::ShaderMode p_shader_mode) {
701
Material *material = material_owner.get_or_null(p_material);
702
if (!material || material->shader_mode != p_shader_mode) {
703
return nullptr;
704
} else {
705
return material->data;
706
}
707
}
708
};
709
710
} // namespace GLES3
711
712
#endif // GLES3_ENABLED
713
714