Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/drivers/gles3/storage/material_storage.cpp
20943 views
1
/**************************************************************************/
2
/* material_storage.cpp */
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
#ifdef GLES3_ENABLED
32
33
#include "core/config/project_settings.h"
34
35
#include "config.h"
36
#include "material_storage.h"
37
#include "particles_storage.h"
38
#include "texture_storage.h"
39
40
#include "drivers/gles3/rasterizer_canvas_gles3.h"
41
#include "drivers/gles3/rasterizer_gles3.h"
42
#include "servers/rendering/storage/variant_converters.h"
43
44
using namespace GLES3;
45
46
///////////////////////////////////////////////////////////////////////////
47
// UBI helper functions
48
49
static void _fill_std140_variant_ubo_value(ShaderLanguage::DataType type, int p_array_size, const Variant &value, uint8_t *data) {
50
switch (type) {
51
case ShaderLanguage::TYPE_BOOL: {
52
uint32_t *gui = (uint32_t *)data;
53
54
if (p_array_size > 0) {
55
PackedInt32Array ba = value;
56
for (int i = 0; i < ba.size(); i++) {
57
ba.set(i, ba[i] ? 1 : 0);
58
}
59
write_array_std140<int32_t>(ba, gui, p_array_size, 4);
60
} else {
61
bool v = value;
62
gui[0] = v ? 1 : 0;
63
}
64
} break;
65
case ShaderLanguage::TYPE_BVEC2: {
66
uint32_t *gui = (uint32_t *)data;
67
68
if (p_array_size > 0) {
69
PackedInt32Array ba = convert_array_std140<Vector2i, int32_t>(value);
70
for (int i = 0; i < ba.size(); i++) {
71
ba.set(i, ba[i] ? 1 : 0);
72
}
73
write_array_std140<Vector2i>(ba, gui, p_array_size, 4);
74
} else {
75
uint32_t v = value;
76
gui[0] = v & 1 ? 1 : 0;
77
gui[1] = v & 2 ? 1 : 0;
78
}
79
} break;
80
case ShaderLanguage::TYPE_BVEC3: {
81
uint32_t *gui = (uint32_t *)data;
82
83
if (p_array_size > 0) {
84
PackedInt32Array ba = convert_array_std140<Vector3i, int32_t>(value);
85
for (int i = 0; i < ba.size(); i++) {
86
ba.set(i, ba[i] ? 1 : 0);
87
}
88
write_array_std140<Vector3i>(ba, gui, p_array_size, 4);
89
} else {
90
uint32_t v = value;
91
gui[0] = (v & 1) ? 1 : 0;
92
gui[1] = (v & 2) ? 1 : 0;
93
gui[2] = (v & 4) ? 1 : 0;
94
}
95
} break;
96
case ShaderLanguage::TYPE_BVEC4: {
97
uint32_t *gui = (uint32_t *)data;
98
99
if (p_array_size > 0) {
100
PackedInt32Array ba = convert_array_std140<Vector4i, int32_t>(value);
101
for (int i = 0; i < ba.size(); i++) {
102
ba.set(i, ba[i] ? 1 : 0);
103
}
104
write_array_std140<Vector4i>(ba, gui, p_array_size, 4);
105
} else {
106
uint32_t v = value;
107
gui[0] = (v & 1) ? 1 : 0;
108
gui[1] = (v & 2) ? 1 : 0;
109
gui[2] = (v & 4) ? 1 : 0;
110
gui[3] = (v & 8) ? 1 : 0;
111
}
112
} break;
113
case ShaderLanguage::TYPE_INT: {
114
int32_t *gui = (int32_t *)data;
115
116
if (p_array_size > 0) {
117
const PackedInt32Array &iv = value;
118
write_array_std140<int32_t>(iv, gui, p_array_size, 4);
119
} else {
120
int v = value;
121
gui[0] = v;
122
}
123
} break;
124
case ShaderLanguage::TYPE_IVEC2: {
125
int32_t *gui = (int32_t *)data;
126
127
if (p_array_size > 0) {
128
const PackedInt32Array &iv = convert_array_std140<Vector2i, int32_t>(value);
129
write_array_std140<Vector2i>(iv, gui, p_array_size, 4);
130
} else {
131
Vector2i v = convert_to_vector<Vector2i>(value);
132
gui[0] = v.x;
133
gui[1] = v.y;
134
}
135
} break;
136
case ShaderLanguage::TYPE_IVEC3: {
137
int32_t *gui = (int32_t *)data;
138
139
if (p_array_size > 0) {
140
const PackedInt32Array &iv = convert_array_std140<Vector3i, int32_t>(value);
141
write_array_std140<Vector3i>(iv, gui, p_array_size, 4);
142
} else {
143
Vector3i v = convert_to_vector<Vector3i>(value);
144
gui[0] = v.x;
145
gui[1] = v.y;
146
gui[2] = v.z;
147
}
148
} break;
149
case ShaderLanguage::TYPE_IVEC4: {
150
int32_t *gui = (int32_t *)data;
151
152
if (p_array_size > 0) {
153
const PackedInt32Array &iv = convert_array_std140<Vector4i, int32_t>(value);
154
write_array_std140<Vector4i>(iv, gui, p_array_size, 4);
155
} else {
156
Vector4i v = convert_to_vector<Vector4i>(value);
157
gui[0] = v.x;
158
gui[1] = v.y;
159
gui[2] = v.z;
160
gui[3] = v.w;
161
}
162
} break;
163
case ShaderLanguage::TYPE_UINT: {
164
uint32_t *gui = (uint32_t *)data;
165
166
if (p_array_size > 0) {
167
const PackedInt32Array &iv = value;
168
write_array_std140<uint32_t>(iv, gui, p_array_size, 4);
169
} else {
170
int v = value;
171
gui[0] = v;
172
}
173
} break;
174
case ShaderLanguage::TYPE_UVEC2: {
175
uint32_t *gui = (uint32_t *)data;
176
177
if (p_array_size > 0) {
178
const PackedInt32Array &iv = convert_array_std140<Vector2i, int32_t>(value);
179
write_array_std140<Vector2i>(iv, gui, p_array_size, 4);
180
} else {
181
Vector2i v = convert_to_vector<Vector2i>(value);
182
gui[0] = v.x;
183
gui[1] = v.y;
184
}
185
} break;
186
case ShaderLanguage::TYPE_UVEC3: {
187
uint32_t *gui = (uint32_t *)data;
188
189
if (p_array_size > 0) {
190
const PackedInt32Array &iv = convert_array_std140<Vector3i, int32_t>(value);
191
write_array_std140<Vector3i>(iv, gui, p_array_size, 4);
192
} else {
193
Vector3i v = convert_to_vector<Vector3i>(value);
194
gui[0] = v.x;
195
gui[1] = v.y;
196
gui[2] = v.z;
197
}
198
} break;
199
case ShaderLanguage::TYPE_UVEC4: {
200
uint32_t *gui = (uint32_t *)data;
201
202
if (p_array_size > 0) {
203
const PackedInt32Array &iv = convert_array_std140<Vector4i, int32_t>(value);
204
write_array_std140<Vector4i>(iv, gui, p_array_size, 4);
205
} else {
206
Vector4i v = convert_to_vector<Vector4i>(value);
207
gui[0] = v.x;
208
gui[1] = v.y;
209
gui[2] = v.z;
210
gui[3] = v.w;
211
}
212
} break;
213
case ShaderLanguage::TYPE_FLOAT: {
214
float *gui = (float *)data;
215
216
if (p_array_size > 0) {
217
const PackedFloat32Array &a = value;
218
write_array_std140<float>(a, gui, p_array_size, 4);
219
} else {
220
float v = value;
221
gui[0] = v;
222
}
223
} break;
224
case ShaderLanguage::TYPE_VEC2: {
225
float *gui = (float *)data;
226
227
if (p_array_size > 0) {
228
const PackedFloat32Array &a = convert_array_std140<Vector2, float>(value);
229
write_array_std140<Vector2>(a, gui, p_array_size, 4);
230
} else {
231
Vector2 v = convert_to_vector<Vector2>(value);
232
gui[0] = v.x;
233
gui[1] = v.y;
234
}
235
} break;
236
case ShaderLanguage::TYPE_VEC3: {
237
float *gui = (float *)data;
238
239
if (p_array_size > 0) {
240
const PackedFloat32Array &a = convert_array_std140<Vector3, float>(value);
241
write_array_std140<Vector3>(a, gui, p_array_size, 4);
242
} else {
243
Vector3 v = convert_to_vector<Vector3>(value);
244
gui[0] = v.x;
245
gui[1] = v.y;
246
gui[2] = v.z;
247
}
248
} break;
249
case ShaderLanguage::TYPE_VEC4: {
250
float *gui = (float *)data;
251
252
if (p_array_size > 0) {
253
const PackedFloat32Array &a = convert_array_std140<Vector4, float>(value);
254
write_array_std140<Vector4>(a, gui, p_array_size, 4);
255
} else {
256
Vector4 v = convert_to_vector<Vector4>(value);
257
gui[0] = v.x;
258
gui[1] = v.y;
259
gui[2] = v.z;
260
gui[3] = v.w;
261
}
262
} break;
263
case ShaderLanguage::TYPE_MAT2: {
264
float *gui = (float *)data;
265
266
if (p_array_size > 0) {
267
const PackedFloat32Array &a = value;
268
int s = a.size();
269
270
for (int i = 0, j = 0; i < p_array_size * 4; i += 4, j += 8) {
271
if (i + 3 < s) {
272
gui[j] = a[i];
273
gui[j + 1] = a[i + 1];
274
275
gui[j + 4] = a[i + 2];
276
gui[j + 5] = a[i + 3];
277
} else {
278
gui[j] = 1;
279
gui[j + 1] = 0;
280
281
gui[j + 4] = 0;
282
gui[j + 5] = 1;
283
}
284
gui[j + 2] = 0; // ignored
285
gui[j + 3] = 0; // ignored
286
gui[j + 6] = 0; // ignored
287
gui[j + 7] = 0; // ignored
288
}
289
} else {
290
Transform2D v = value;
291
292
//in std140 members of mat2 are treated as vec4s
293
gui[0] = v.columns[0][0];
294
gui[1] = v.columns[0][1];
295
gui[2] = 0; // ignored
296
gui[3] = 0; // ignored
297
298
gui[4] = v.columns[1][0];
299
gui[5] = v.columns[1][1];
300
gui[6] = 0; // ignored
301
gui[7] = 0; // ignored
302
}
303
} break;
304
case ShaderLanguage::TYPE_MAT3: {
305
float *gui = (float *)data;
306
307
if (p_array_size > 0) {
308
const PackedFloat32Array &a = convert_array_std140<Basis, float>(value);
309
const Basis default_basis;
310
const int s = a.size();
311
312
for (int i = 0, j = 0; i < p_array_size * 9; i += 9, j += 12) {
313
if (i + 8 < s) {
314
gui[j] = a[i];
315
gui[j + 1] = a[i + 1];
316
gui[j + 2] = a[i + 2];
317
gui[j + 3] = 0; // Ignored.
318
319
gui[j + 4] = a[i + 3];
320
gui[j + 5] = a[i + 4];
321
gui[j + 6] = a[i + 5];
322
gui[j + 7] = 0; // Ignored.
323
324
gui[j + 8] = a[i + 6];
325
gui[j + 9] = a[i + 7];
326
gui[j + 10] = a[i + 8];
327
gui[j + 11] = 0; // Ignored.
328
} else {
329
convert_item_std140(default_basis, gui + j);
330
}
331
}
332
} else {
333
convert_item_std140<Basis>(value, gui);
334
}
335
} break;
336
case ShaderLanguage::TYPE_MAT4: {
337
float *gui = (float *)data;
338
339
if (p_array_size > 0) {
340
const PackedFloat32Array &a = convert_array_std140<Projection, float>(value);
341
write_array_std140<Projection>(a, gui, p_array_size, 16);
342
} else {
343
convert_item_std140<Projection>(value, gui);
344
}
345
} break;
346
default: {
347
}
348
}
349
}
350
351
_FORCE_INLINE_ static void _fill_std140_ubo_value(ShaderLanguage::DataType type, const Vector<ShaderLanguage::Scalar> &value, uint8_t *data) {
352
switch (type) {
353
case ShaderLanguage::TYPE_BOOL: {
354
uint32_t *gui = (uint32_t *)data;
355
gui[0] = value[0].boolean ? 1 : 0;
356
} break;
357
case ShaderLanguage::TYPE_BVEC2: {
358
uint32_t *gui = (uint32_t *)data;
359
gui[0] = value[0].boolean ? 1 : 0;
360
gui[1] = value[1].boolean ? 1 : 0;
361
362
} break;
363
case ShaderLanguage::TYPE_BVEC3: {
364
uint32_t *gui = (uint32_t *)data;
365
gui[0] = value[0].boolean ? 1 : 0;
366
gui[1] = value[1].boolean ? 1 : 0;
367
gui[2] = value[2].boolean ? 1 : 0;
368
369
} break;
370
case ShaderLanguage::TYPE_BVEC4: {
371
uint32_t *gui = (uint32_t *)data;
372
gui[0] = value[0].boolean ? 1 : 0;
373
gui[1] = value[1].boolean ? 1 : 0;
374
gui[2] = value[2].boolean ? 1 : 0;
375
gui[3] = value[3].boolean ? 1 : 0;
376
377
} break;
378
case ShaderLanguage::TYPE_INT: {
379
int32_t *gui = (int32_t *)data;
380
gui[0] = value[0].sint;
381
382
} break;
383
case ShaderLanguage::TYPE_IVEC2: {
384
int32_t *gui = (int32_t *)data;
385
386
for (int i = 0; i < 2; i++) {
387
gui[i] = value[i].sint;
388
}
389
390
} break;
391
case ShaderLanguage::TYPE_IVEC3: {
392
int32_t *gui = (int32_t *)data;
393
394
for (int i = 0; i < 3; i++) {
395
gui[i] = value[i].sint;
396
}
397
398
} break;
399
case ShaderLanguage::TYPE_IVEC4: {
400
int32_t *gui = (int32_t *)data;
401
402
for (int i = 0; i < 4; i++) {
403
gui[i] = value[i].sint;
404
}
405
406
} break;
407
case ShaderLanguage::TYPE_UINT: {
408
uint32_t *gui = (uint32_t *)data;
409
gui[0] = value[0].uint;
410
411
} break;
412
case ShaderLanguage::TYPE_UVEC2: {
413
int32_t *gui = (int32_t *)data;
414
415
for (int i = 0; i < 2; i++) {
416
gui[i] = value[i].uint;
417
}
418
} break;
419
case ShaderLanguage::TYPE_UVEC3: {
420
int32_t *gui = (int32_t *)data;
421
422
for (int i = 0; i < 3; i++) {
423
gui[i] = value[i].uint;
424
}
425
426
} break;
427
case ShaderLanguage::TYPE_UVEC4: {
428
int32_t *gui = (int32_t *)data;
429
430
for (int i = 0; i < 4; i++) {
431
gui[i] = value[i].uint;
432
}
433
} break;
434
case ShaderLanguage::TYPE_FLOAT: {
435
float *gui = (float *)data;
436
gui[0] = value[0].real;
437
438
} break;
439
case ShaderLanguage::TYPE_VEC2: {
440
float *gui = (float *)data;
441
442
for (int i = 0; i < 2; i++) {
443
gui[i] = value[i].real;
444
}
445
446
} break;
447
case ShaderLanguage::TYPE_VEC3: {
448
float *gui = (float *)data;
449
450
for (int i = 0; i < 3; i++) {
451
gui[i] = value[i].real;
452
}
453
454
} break;
455
case ShaderLanguage::TYPE_VEC4: {
456
float *gui = (float *)data;
457
458
for (int i = 0; i < 4; i++) {
459
gui[i] = value[i].real;
460
}
461
} break;
462
case ShaderLanguage::TYPE_MAT2: {
463
float *gui = (float *)data;
464
465
//in std140 members of mat2 are treated as vec4s
466
gui[0] = value[0].real;
467
gui[1] = value[1].real;
468
gui[2] = 0;
469
gui[3] = 0;
470
gui[4] = value[2].real;
471
gui[5] = value[3].real;
472
gui[6] = 0;
473
gui[7] = 0;
474
} break;
475
case ShaderLanguage::TYPE_MAT3: {
476
float *gui = (float *)data;
477
478
gui[0] = value[0].real;
479
gui[1] = value[1].real;
480
gui[2] = value[2].real;
481
gui[3] = 0;
482
gui[4] = value[3].real;
483
gui[5] = value[4].real;
484
gui[6] = value[5].real;
485
gui[7] = 0;
486
gui[8] = value[6].real;
487
gui[9] = value[7].real;
488
gui[10] = value[8].real;
489
gui[11] = 0;
490
} break;
491
case ShaderLanguage::TYPE_MAT4: {
492
float *gui = (float *)data;
493
494
for (int i = 0; i < 16; i++) {
495
gui[i] = value[i].real;
496
}
497
} break;
498
default: {
499
}
500
}
501
}
502
503
_FORCE_INLINE_ static void _fill_std140_ubo_empty(ShaderLanguage::DataType type, int p_array_size, uint8_t *data) {
504
if (p_array_size <= 0) {
505
p_array_size = 1;
506
}
507
508
switch (type) {
509
case ShaderLanguage::TYPE_BOOL:
510
case ShaderLanguage::TYPE_INT:
511
case ShaderLanguage::TYPE_UINT:
512
case ShaderLanguage::TYPE_FLOAT: {
513
memset(data, 0, 4 * p_array_size);
514
} break;
515
case ShaderLanguage::TYPE_BVEC2:
516
case ShaderLanguage::TYPE_IVEC2:
517
case ShaderLanguage::TYPE_UVEC2:
518
case ShaderLanguage::TYPE_VEC2: {
519
memset(data, 0, 8 * p_array_size);
520
} break;
521
case ShaderLanguage::TYPE_BVEC3:
522
case ShaderLanguage::TYPE_IVEC3:
523
case ShaderLanguage::TYPE_UVEC3:
524
case ShaderLanguage::TYPE_VEC3: {
525
memset(data, 0, 12 * p_array_size);
526
} break;
527
case ShaderLanguage::TYPE_BVEC4:
528
case ShaderLanguage::TYPE_IVEC4:
529
case ShaderLanguage::TYPE_UVEC4:
530
case ShaderLanguage::TYPE_VEC4: {
531
memset(data, 0, 16 * p_array_size);
532
} break;
533
case ShaderLanguage::TYPE_MAT2: {
534
memset(data, 0, 32 * p_array_size);
535
} break;
536
case ShaderLanguage::TYPE_MAT3: {
537
memset(data, 0, 48 * p_array_size);
538
} break;
539
case ShaderLanguage::TYPE_MAT4: {
540
memset(data, 0, 64 * p_array_size);
541
} break;
542
543
default: {
544
}
545
}
546
}
547
548
///////////////////////////////////////////////////////////////////////////
549
// ShaderData
550
551
void ShaderData::set_path_hint(const String &p_hint) {
552
path = p_hint;
553
}
554
555
void ShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) {
556
if (!p_texture.is_valid()) {
557
if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) {
558
default_texture_params[p_name].erase(p_index);
559
560
if (default_texture_params[p_name].is_empty()) {
561
default_texture_params.erase(p_name);
562
}
563
}
564
} else {
565
if (!default_texture_params.has(p_name)) {
566
default_texture_params[p_name] = HashMap<int, RID>();
567
}
568
default_texture_params[p_name][p_index] = p_texture;
569
}
570
}
571
572
Variant ShaderData::get_default_parameter(const StringName &p_parameter) const {
573
if (uniforms.has(p_parameter)) {
574
ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter];
575
Vector<ShaderLanguage::Scalar> default_value = uniform.default_value;
576
if (default_value.is_empty()) {
577
return ShaderLanguage::get_default_datatype_value(uniform.type, uniform.array_size, uniform.hint);
578
}
579
return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint);
580
}
581
return Variant();
582
}
583
584
void ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const {
585
SortArray<Pair<StringName, int>, ShaderLanguage::UniformOrderComparator> sorter;
586
LocalVector<Pair<StringName, int>> filtered_uniforms;
587
588
for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) {
589
if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL) {
590
continue;
591
}
592
filtered_uniforms.push_back(Pair<StringName, int>(E.key, E.value.prop_order));
593
}
594
int uniform_count = filtered_uniforms.size();
595
sorter.sort(filtered_uniforms.ptr(), uniform_count);
596
597
String last_group;
598
for (int i = 0; i < uniform_count; i++) {
599
const StringName &uniform_name = filtered_uniforms[i].first;
600
const ShaderLanguage::ShaderNode::Uniform &uniform = uniforms[uniform_name];
601
602
String group = uniform.group;
603
if (!uniform.subgroup.is_empty()) {
604
group += "::" + uniform.subgroup;
605
}
606
607
if (group != last_group) {
608
PropertyInfo pi;
609
pi.usage = PROPERTY_USAGE_GROUP;
610
pi.name = group;
611
p_param_list->push_back(pi);
612
613
last_group = group;
614
}
615
616
PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniform);
617
pi.name = uniform_name;
618
p_param_list->push_back(pi);
619
}
620
}
621
622
void ShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const {
623
for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) {
624
if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) {
625
continue;
626
}
627
628
RendererMaterialStorage::InstanceShaderParam p;
629
p.info = ShaderLanguage::uniform_to_property_info(E.value);
630
p.info.name = E.key; //supply name
631
p.index = E.value.instance_index;
632
p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint);
633
p_param_list->push_back(p);
634
}
635
}
636
637
bool ShaderData::is_parameter_texture(const StringName &p_param) const {
638
if (!uniforms.has(p_param)) {
639
return false;
640
}
641
642
return uniforms[p_param].is_texture();
643
}
644
645
///////////////////////////////////////////////////////////////////////////
646
// MaterialData
647
648
// Look up table to translate ShaderLanguage::DataType to GL_TEXTURE_*
649
static const GLenum target_from_type[ShaderLanguage::TYPE_MAX] = {
650
GL_TEXTURE_2D, // TYPE_VOID,
651
GL_TEXTURE_2D, // TYPE_BOOL,
652
GL_TEXTURE_2D, // TYPE_BVEC2,
653
GL_TEXTURE_2D, // TYPE_BVEC3,
654
GL_TEXTURE_2D, // TYPE_BVEC4,
655
GL_TEXTURE_2D, // TYPE_INT,
656
GL_TEXTURE_2D, // TYPE_IVEC2,
657
GL_TEXTURE_2D, // TYPE_IVEC3,
658
GL_TEXTURE_2D, // TYPE_IVEC4,
659
GL_TEXTURE_2D, // TYPE_UINT,
660
GL_TEXTURE_2D, // TYPE_UVEC2,
661
GL_TEXTURE_2D, // TYPE_UVEC3,
662
GL_TEXTURE_2D, // TYPE_UVEC4,
663
GL_TEXTURE_2D, // TYPE_FLOAT,
664
GL_TEXTURE_2D, // TYPE_VEC2,
665
GL_TEXTURE_2D, // TYPE_VEC3,
666
GL_TEXTURE_2D, // TYPE_VEC4,
667
GL_TEXTURE_2D, // TYPE_MAT2,
668
GL_TEXTURE_2D, // TYPE_MAT3,
669
GL_TEXTURE_2D, // TYPE_MAT4,
670
GL_TEXTURE_2D, // TYPE_SAMPLER2D,
671
GL_TEXTURE_2D, // TYPE_ISAMPLER2D,
672
GL_TEXTURE_2D, // TYPE_USAMPLER2D,
673
GL_TEXTURE_2D_ARRAY, // TYPE_SAMPLER2DARRAY,
674
GL_TEXTURE_2D_ARRAY, // TYPE_ISAMPLER2DARRAY,
675
GL_TEXTURE_2D_ARRAY, // TYPE_USAMPLER2DARRAY,
676
GL_TEXTURE_3D, // TYPE_SAMPLER3D,
677
GL_TEXTURE_3D, // TYPE_ISAMPLER3D,
678
GL_TEXTURE_3D, // TYPE_USAMPLER3D,
679
GL_TEXTURE_CUBE_MAP, // TYPE_SAMPLERCUBE,
680
GL_TEXTURE_CUBE_MAP, // TYPE_SAMPLERCUBEARRAY,
681
_GL_TEXTURE_EXTERNAL_OES, // TYPE_SAMPLEREXT
682
GL_TEXTURE_2D, // TYPE_STRUCT
683
};
684
685
static const RS::CanvasItemTextureRepeat repeat_from_uniform[ShaderLanguage::REPEAT_DEFAULT + 1] = {
686
RS::CanvasItemTextureRepeat::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED, // ShaderLanguage::TextureRepeat::REPEAT_DISABLE,
687
RS::CanvasItemTextureRepeat::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED, // ShaderLanguage::TextureRepeat::REPEAT_ENABLE,
688
RS::CanvasItemTextureRepeat::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED, // ShaderLanguage::TextureRepeat::REPEAT_DEFAULT,
689
};
690
691
static const RS::CanvasItemTextureRepeat repeat_from_uniform_canvas[ShaderLanguage::REPEAT_DEFAULT + 1] = {
692
RS::CanvasItemTextureRepeat::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED, // ShaderLanguage::TextureRepeat::REPEAT_DISABLE,
693
RS::CanvasItemTextureRepeat::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED, // ShaderLanguage::TextureRepeat::REPEAT_ENABLE,
694
RS::CanvasItemTextureRepeat::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED, // ShaderLanguage::TextureRepeat::REPEAT_DEFAULT,
695
};
696
697
static const RS::CanvasItemTextureFilter filter_from_uniform[ShaderLanguage::FILTER_DEFAULT + 1] = {
698
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, // ShaderLanguage::TextureFilter::FILTER_NEAREST,
699
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, // ShaderLanguage::TextureFilter::FILTER_LINEAR,
700
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, // ShaderLanguage::TextureFilter::FILTER_NEAREST_MIPMAP,
701
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, // ShaderLanguage::TextureFilter::FILTER_LINEAR_MIPMAP,
702
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, // ShaderLanguage::TextureFilter::FILTER_NEAREST_MIPMAP_ANISOTROPIC,
703
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, // ShaderLanguage::TextureFilter::FILTER_LINEAR_MIPMAP_ANISOTROPIC,
704
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, // ShaderLanguage::TextureFilter::FILTER_DEFAULT,
705
};
706
707
static const RS::CanvasItemTextureFilter filter_from_uniform_canvas[ShaderLanguage::FILTER_DEFAULT + 1] = {
708
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, // ShaderLanguage::TextureFilter::FILTER_NEAREST,
709
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, // ShaderLanguage::TextureFilter::FILTER_LINEAR,
710
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, // ShaderLanguage::TextureFilter::FILTER_NEAREST_MIPMAP,
711
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, // ShaderLanguage::TextureFilter::FILTER_LINEAR_MIPMAP,
712
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, // ShaderLanguage::TextureFilter::FILTER_NEAREST_MIPMAP_ANISOTROPIC,
713
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, // ShaderLanguage::TextureFilter::FILTER_LINEAR_MIPMAP_ANISOTROPIC,
714
RS::CanvasItemTextureFilter::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, // ShaderLanguage::TextureFilter::FILTER_DEFAULT,
715
};
716
717
void MaterialData::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) {
718
MaterialStorage *material_storage = MaterialStorage::get_singleton();
719
bool uses_global_buffer = false;
720
721
for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : p_uniforms) {
722
if (E.value.is_texture()) {
723
continue; // texture, does not go here
724
}
725
726
if (E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) {
727
continue; //instance uniforms don't appear in the buffer
728
}
729
730
if (E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL) {
731
//this is a global variable, get the index to it
732
GlobalShaderUniforms::Variable *gv = material_storage->global_shader_uniforms.variables.getptr(E.key);
733
uint32_t index = 0;
734
if (gv) {
735
index = gv->buffer_index;
736
} else {
737
WARN_PRINT("Shader uses global parameter '" + E.key + "', but it was removed at some point. Material will not display correctly.");
738
}
739
740
uint32_t offset = p_uniform_offsets[E.value.order];
741
uint32_t *intptr = (uint32_t *)&p_buffer[offset];
742
*intptr = index;
743
uses_global_buffer = true;
744
continue;
745
}
746
747
//regular uniform
748
uint32_t offset = p_uniform_offsets[E.value.order];
749
#ifdef DEBUG_ENABLED
750
uint32_t size = 0U;
751
// The following code enforces a 16-byte alignment of uniform arrays.
752
if (E.value.array_size > 0) {
753
size = ShaderLanguage::get_datatype_size(E.value.type) * E.value.array_size;
754
int m = (16 * E.value.array_size);
755
if ((size % m) != 0U) {
756
size += m - (size % m);
757
}
758
} else {
759
size = ShaderLanguage::get_datatype_size(E.value.type);
760
}
761
ERR_CONTINUE(offset + size > p_buffer_size);
762
#endif
763
uint8_t *data = &p_buffer[offset];
764
HashMap<StringName, Variant>::ConstIterator V = p_parameters.find(E.key);
765
766
if (V) {
767
//user provided
768
_fill_std140_variant_ubo_value(E.value.type, E.value.array_size, V->value, data);
769
770
} else if (E.value.default_value.size()) {
771
//default value
772
_fill_std140_ubo_value(E.value.type, E.value.default_value, data);
773
//value=E.value.default_value;
774
} else {
775
//zero because it was not provided
776
if ((E.value.type == ShaderLanguage::TYPE_VEC3 || E.value.type == ShaderLanguage::TYPE_VEC4) && E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SOURCE_COLOR) {
777
//colors must be set as black, with alpha as 1.0
778
_fill_std140_variant_ubo_value(E.value.type, E.value.array_size, Color(0, 0, 0, 1), data);
779
} else if ((E.value.type == ShaderLanguage::TYPE_VEC3 || E.value.type == ShaderLanguage::TYPE_VEC4) && E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_COLOR_CONVERSION_DISABLED) {
780
//colors must be set as black, with alpha as 1.0
781
_fill_std140_variant_ubo_value(E.value.type, E.value.array_size, Color(0, 0, 0, 1), data);
782
} else if (E.value.type == ShaderLanguage::TYPE_MAT2) {
783
// mat uniforms are identity matrix by default.
784
_fill_std140_variant_ubo_value(E.value.type, E.value.array_size, Transform2D(), data);
785
} else if (E.value.type == ShaderLanguage::TYPE_MAT3) {
786
_fill_std140_variant_ubo_value(E.value.type, E.value.array_size, Basis(), data);
787
} else if (E.value.type == ShaderLanguage::TYPE_MAT4) {
788
_fill_std140_variant_ubo_value(E.value.type, E.value.array_size, Projection(), data);
789
} else {
790
//else just zero it out
791
_fill_std140_ubo_empty(E.value.type, E.value.array_size, data);
792
}
793
}
794
}
795
796
if (uses_global_buffer != (global_buffer_E != nullptr)) {
797
if (uses_global_buffer) {
798
global_buffer_E = material_storage->global_shader_uniforms.materials_using_buffer.push_back(self);
799
} else {
800
material_storage->global_shader_uniforms.materials_using_buffer.erase(global_buffer_E);
801
global_buffer_E = nullptr;
802
}
803
}
804
}
805
806
MaterialData::~MaterialData() {
807
MaterialStorage *material_storage = MaterialStorage::get_singleton();
808
809
if (global_buffer_E) {
810
//unregister global buffers
811
material_storage->global_shader_uniforms.materials_using_buffer.erase(global_buffer_E);
812
}
813
814
if (global_texture_E) {
815
//unregister global textures
816
817
for (const KeyValue<StringName, uint64_t> &E : used_global_textures) {
818
GlobalShaderUniforms::Variable *v = material_storage->global_shader_uniforms.variables.getptr(E.key);
819
if (v) {
820
v->texture_materials.erase(self);
821
}
822
}
823
//unregister material from those using global textures
824
material_storage->global_shader_uniforms.materials_using_texture.erase(global_texture_E);
825
}
826
827
if (uniform_buffer) {
828
glDeleteBuffers(1, &uniform_buffer);
829
uniform_buffer = 0;
830
}
831
}
832
833
void MaterialData::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_is_3d_shader_type) {
834
TextureStorage *texture_storage = TextureStorage::get_singleton();
835
MaterialStorage *material_storage = MaterialStorage::get_singleton();
836
837
#ifdef TOOLS_ENABLED
838
Texture *roughness_detect_texture = nullptr;
839
RS::TextureDetectRoughnessChannel roughness_channel = RS::TEXTURE_DETECT_ROUGHNESS_R;
840
Texture *normal_detect_texture = nullptr;
841
#endif
842
843
bool uses_global_textures = false;
844
global_textures_pass++;
845
846
for (int i = 0, k = 0; i < p_texture_uniforms.size(); i++) {
847
const StringName &uniform_name = p_texture_uniforms[i].name;
848
int uniform_array_size = p_texture_uniforms[i].array_size;
849
850
Vector<RID> textures;
851
852
if (p_texture_uniforms[i].hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE ||
853
p_texture_uniforms[i].hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE ||
854
p_texture_uniforms[i].hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) {
855
continue;
856
}
857
858
if (p_texture_uniforms[i].global) {
859
uses_global_textures = true;
860
861
GlobalShaderUniforms::Variable *v = material_storage->global_shader_uniforms.variables.getptr(uniform_name);
862
if (v) {
863
if (v->buffer_index >= 0) {
864
WARN_PRINT("Shader uses global parameter texture '" + String(uniform_name) + "', but it changed type and is no longer a texture!");
865
866
} else {
867
HashMap<StringName, uint64_t>::Iterator E = used_global_textures.find(uniform_name);
868
if (!E) {
869
E = used_global_textures.insert(uniform_name, global_textures_pass);
870
v->texture_materials.insert(self);
871
} else {
872
E->value = global_textures_pass;
873
}
874
875
RID override_rid = v->override;
876
if (override_rid.is_valid()) {
877
textures.push_back(override_rid);
878
} else {
879
RID value_rid = v->value;
880
if (value_rid.is_valid()) {
881
textures.push_back(value_rid);
882
}
883
}
884
}
885
886
} else {
887
WARN_PRINT("Shader uses global parameter texture '" + String(uniform_name) + "', but it was removed at some point. Material will not display correctly.");
888
}
889
} else {
890
HashMap<StringName, Variant>::ConstIterator V = p_parameters.find(uniform_name);
891
if (V) {
892
if (V->value.is_array()) {
893
Array array = (Array)V->value;
894
if (uniform_array_size > 0) {
895
int size = MIN(uniform_array_size, array.size());
896
for (int j = 0; j < size; j++) {
897
textures.push_back(array[j]);
898
}
899
} else {
900
if (array.size() > 0) {
901
textures.push_back(array[0]);
902
}
903
}
904
} else {
905
textures.push_back(V->value);
906
}
907
}
908
909
if (uniform_array_size > 0) {
910
if (textures.size() < uniform_array_size) {
911
HashMap<StringName, HashMap<int, RID>>::ConstIterator W = p_default_textures.find(uniform_name);
912
for (int j = textures.size(); j < uniform_array_size; j++) {
913
if (W && W->value.has(j)) {
914
textures.push_back(W->value[j]);
915
} else {
916
textures.push_back(RID());
917
}
918
}
919
}
920
} else if (textures.is_empty()) {
921
HashMap<StringName, HashMap<int, RID>>::ConstIterator W = p_default_textures.find(uniform_name);
922
if (W && W->value.has(0)) {
923
textures.push_back(W->value[0]);
924
}
925
}
926
}
927
928
RID gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_WHITE);
929
930
if (textures.is_empty()) {
931
//check default usage
932
switch (p_texture_uniforms[i].type) {
933
case ShaderLanguage::TYPE_ISAMPLER2D:
934
case ShaderLanguage::TYPE_USAMPLER2D:
935
case ShaderLanguage::TYPE_SAMPLER2D: {
936
switch (p_texture_uniforms[i].hint) {
937
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
938
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_BLACK);
939
} break;
940
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
941
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_TRANSPARENT);
942
} break;
943
case ShaderLanguage::ShaderNode::Uniform::HINT_ANISOTROPY: {
944
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_ANISO);
945
} break;
946
case ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL: {
947
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_NORMAL);
948
} break;
949
case ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_NORMAL: {
950
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_NORMAL);
951
} break;
952
default: {
953
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_WHITE);
954
} break;
955
}
956
} break;
957
958
case ShaderLanguage::TYPE_SAMPLERCUBE: {
959
switch (p_texture_uniforms[i].hint) {
960
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
961
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_BLACK);
962
} break;
963
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
964
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_TRANSPARENT);
965
} break;
966
default: {
967
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_WHITE);
968
} break;
969
}
970
} break;
971
case ShaderLanguage::TYPE_SAMPLERCUBEARRAY: {
972
ERR_PRINT_ONCE("Type: SamplerCubeArray is not supported in the Compatibility renderer, please use another type.");
973
} break;
974
case ShaderLanguage::TYPE_SAMPLEREXT: {
975
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_EXT);
976
} break;
977
978
case ShaderLanguage::TYPE_ISAMPLER3D:
979
case ShaderLanguage::TYPE_USAMPLER3D:
980
case ShaderLanguage::TYPE_SAMPLER3D: {
981
switch (p_texture_uniforms[i].hint) {
982
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
983
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_BLACK);
984
} break;
985
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
986
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_TRANSPARENT);
987
} break;
988
default: {
989
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_WHITE);
990
} break;
991
}
992
} break;
993
994
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
995
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
996
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
997
switch (p_texture_uniforms[i].hint) {
998
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
999
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_BLACK);
1000
} break;
1001
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
1002
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_TRANSPARENT);
1003
} break;
1004
default: {
1005
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_WHITE);
1006
} break;
1007
}
1008
} break;
1009
1010
default: {
1011
}
1012
}
1013
#ifdef TOOLS_ENABLED
1014
if (roughness_detect_texture && normal_detect_texture && !normal_detect_texture->path.is_empty()) {
1015
roughness_detect_texture->detect_roughness_callback(roughness_detect_texture->detect_roughness_callback_ud, normal_detect_texture->path, roughness_channel);
1016
}
1017
#endif
1018
if (uniform_array_size > 0) {
1019
for (int j = 0; j < uniform_array_size; j++) {
1020
p_textures[k++] = gl_texture;
1021
}
1022
} else {
1023
p_textures[k++] = gl_texture;
1024
}
1025
} else {
1026
for (int j = 0; j < textures.size(); j++) {
1027
Texture *tex = TextureStorage::get_singleton()->get_texture(textures[j]);
1028
1029
if (tex) {
1030
gl_texture = textures[j];
1031
#ifdef TOOLS_ENABLED
1032
if (tex->detect_3d_callback && p_is_3d_shader_type) {
1033
tex->detect_3d_callback(tex->detect_3d_callback_ud);
1034
}
1035
if (tex->detect_normal_callback && (p_texture_uniforms[i].hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL || p_texture_uniforms[i].hint == ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_NORMAL)) {
1036
if (p_texture_uniforms[i].hint == ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_NORMAL) {
1037
normal_detect_texture = tex;
1038
}
1039
tex->detect_normal_callback(tex->detect_normal_callback_ud);
1040
}
1041
if (tex->detect_roughness_callback && (p_texture_uniforms[i].hint >= ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_R || p_texture_uniforms[i].hint <= ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_GRAY)) {
1042
//find the normal texture
1043
roughness_detect_texture = tex;
1044
roughness_channel = RS::TextureDetectRoughnessChannel(p_texture_uniforms[i].hint - ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_R);
1045
}
1046
#endif
1047
}
1048
#ifdef TOOLS_ENABLED
1049
if (roughness_detect_texture && normal_detect_texture && !normal_detect_texture->path.is_empty()) {
1050
roughness_detect_texture->detect_roughness_callback(roughness_detect_texture->detect_roughness_callback_ud, normal_detect_texture->path, roughness_channel);
1051
}
1052
#endif
1053
p_textures[k++] = gl_texture;
1054
}
1055
}
1056
}
1057
{
1058
//for textures no longer used, unregister them
1059
List<StringName> to_delete;
1060
for (KeyValue<StringName, uint64_t> &E : used_global_textures) {
1061
if (E.value != global_textures_pass) {
1062
to_delete.push_back(E.key);
1063
1064
GlobalShaderUniforms::Variable *v = material_storage->global_shader_uniforms.variables.getptr(E.key);
1065
if (v) {
1066
v->texture_materials.erase(self);
1067
}
1068
}
1069
}
1070
1071
while (to_delete.front()) {
1072
used_global_textures.erase(to_delete.front()->get());
1073
to_delete.pop_front();
1074
}
1075
//handle registering/unregistering global textures
1076
if (uses_global_textures != (global_texture_E != nullptr)) {
1077
if (uses_global_textures) {
1078
global_texture_E = material_storage->global_shader_uniforms.materials_using_texture.push_back(self);
1079
} else {
1080
material_storage->global_shader_uniforms.materials_using_texture.erase(global_texture_E);
1081
global_texture_E = nullptr;
1082
}
1083
}
1084
}
1085
}
1086
1087
void MaterialData::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) {
1088
if ((uint32_t)ubo_data.size() != p_ubo_size) {
1089
p_uniform_dirty = true;
1090
if (!uniform_buffer) {
1091
glGenBuffers(1, &uniform_buffer);
1092
}
1093
1094
ubo_data.resize(p_ubo_size);
1095
if (ubo_data.size()) {
1096
ERR_FAIL_COND(p_ubo_size > uint32_t(Config::get_singleton()->max_uniform_buffer_size));
1097
memset(ubo_data.ptrw(), 0, ubo_data.size()); //clear
1098
}
1099
}
1100
1101
//check whether buffer changed
1102
if (p_uniform_dirty && ubo_data.size()) {
1103
update_uniform_buffer(p_uniforms, p_uniform_offsets, p_parameters, ubo_data.ptrw(), ubo_data.size());
1104
glBindBuffer(GL_UNIFORM_BUFFER, uniform_buffer);
1105
glBufferData(GL_UNIFORM_BUFFER, ubo_data.size(), ubo_data.ptrw(), GL_DYNAMIC_DRAW);
1106
glBindBuffer(GL_UNIFORM_BUFFER, 0);
1107
}
1108
1109
uint32_t tex_uniform_count = 0U;
1110
for (int i = 0; i < p_texture_uniforms.size(); i++) {
1111
tex_uniform_count += uint32_t(p_texture_uniforms[i].array_size > 0 ? p_texture_uniforms[i].array_size : 1);
1112
}
1113
1114
if ((uint32_t)texture_cache.size() != tex_uniform_count || p_textures_dirty) {
1115
texture_cache.resize(tex_uniform_count);
1116
p_textures_dirty = true;
1117
}
1118
1119
if (p_textures_dirty && tex_uniform_count) {
1120
update_textures(p_parameters, p_default_texture_params, p_texture_uniforms, texture_cache.ptrw(), p_is_3d_shader_type);
1121
}
1122
}
1123
1124
///////////////////////////////////////////////////////////////////////////
1125
// Material Storage
1126
1127
MaterialStorage *MaterialStorage::singleton = nullptr;
1128
1129
MaterialStorage *MaterialStorage::get_singleton() {
1130
return singleton;
1131
}
1132
1133
MaterialStorage::MaterialStorage() {
1134
singleton = this;
1135
1136
shader_data_request_func[RS::SHADER_SPATIAL] = _create_scene_shader_func;
1137
shader_data_request_func[RS::SHADER_CANVAS_ITEM] = _create_canvas_shader_func;
1138
shader_data_request_func[RS::SHADER_PARTICLES] = _create_particles_shader_func;
1139
shader_data_request_func[RS::SHADER_SKY] = _create_sky_shader_func;
1140
shader_data_request_func[RS::SHADER_TEXTURE_BLIT] = _create_tex_blit_shader_func;
1141
shader_data_request_func[RS::SHADER_FOG] = nullptr;
1142
1143
material_data_request_func[RS::SHADER_SPATIAL] = _create_scene_material_func;
1144
material_data_request_func[RS::SHADER_CANVAS_ITEM] = _create_canvas_material_func;
1145
material_data_request_func[RS::SHADER_PARTICLES] = _create_particles_material_func;
1146
material_data_request_func[RS::SHADER_SKY] = _create_sky_material_func;
1147
material_data_request_func[RS::SHADER_TEXTURE_BLIT] = _create_tex_blit_material_func;
1148
material_data_request_func[RS::SHADER_FOG] = nullptr;
1149
1150
static_assert(sizeof(GlobalShaderUniforms::Value) == 16);
1151
1152
global_shader_uniforms.buffer_size = MAX(16, (int)GLOBAL_GET("rendering/limits/global_shader_variables/buffer_size"));
1153
if (global_shader_uniforms.buffer_size * sizeof(GlobalShaderUniforms::Value) > uint32_t(Config::get_singleton()->max_uniform_buffer_size)) {
1154
// Limit to maximum support UBO size.
1155
global_shader_uniforms.buffer_size = uint32_t(Config::get_singleton()->max_uniform_buffer_size) / sizeof(GlobalShaderUniforms::Value);
1156
}
1157
1158
global_shader_uniforms.buffer_values = memnew_arr(GlobalShaderUniforms::Value, global_shader_uniforms.buffer_size);
1159
memset(global_shader_uniforms.buffer_values, 0, sizeof(GlobalShaderUniforms::Value) * global_shader_uniforms.buffer_size);
1160
global_shader_uniforms.buffer_usage = memnew_arr(GlobalShaderUniforms::ValueUsage, global_shader_uniforms.buffer_size);
1161
global_shader_uniforms.buffer_dirty_regions = memnew_arr(bool, 1 + (global_shader_uniforms.buffer_size / GlobalShaderUniforms::BUFFER_DIRTY_REGION_SIZE));
1162
memset(global_shader_uniforms.buffer_dirty_regions, 0, sizeof(bool) * (1 + (global_shader_uniforms.buffer_size / GlobalShaderUniforms::BUFFER_DIRTY_REGION_SIZE)));
1163
glGenBuffers(1, &global_shader_uniforms.buffer);
1164
glBindBuffer(GL_UNIFORM_BUFFER, global_shader_uniforms.buffer);
1165
glBufferData(GL_UNIFORM_BUFFER, sizeof(GlobalShaderUniforms::Value) * global_shader_uniforms.buffer_size, nullptr, GL_DYNAMIC_DRAW);
1166
glBindBuffer(GL_UNIFORM_BUFFER, 0);
1167
1168
{
1169
// Setup CanvasItem compiler
1170
ShaderCompiler::DefaultIdentifierActions actions;
1171
1172
actions.renames["VERTEX"] = "vertex";
1173
actions.renames["LIGHT_VERTEX"] = "light_vertex";
1174
actions.renames["SHADOW_VERTEX"] = "shadow_vertex";
1175
actions.renames["UV"] = "uv";
1176
actions.renames["POINT_SIZE"] = "point_size";
1177
1178
actions.renames["MODEL_MATRIX"] = "model_matrix";
1179
actions.renames["CANVAS_MATRIX"] = "canvas_transform";
1180
actions.renames["SCREEN_MATRIX"] = "screen_transform";
1181
actions.renames["TIME"] = "time";
1182
actions.renames["PI"] = String::num(Math::PI);
1183
actions.renames["TAU"] = String::num(Math::TAU);
1184
actions.renames["E"] = String::num(Math::E);
1185
actions.renames["AT_LIGHT_PASS"] = "false";
1186
actions.renames["INSTANCE_CUSTOM"] = "instance_custom";
1187
1188
actions.renames["COLOR"] = "color";
1189
actions.renames["NORMAL"] = "normal";
1190
actions.renames["NORMAL_MAP"] = "normal_map";
1191
actions.renames["NORMAL_MAP_DEPTH"] = "normal_map_depth";
1192
actions.renames["TEXTURE"] = "color_texture";
1193
actions.renames["TEXTURE_PIXEL_SIZE"] = "color_texture_pixel_size";
1194
actions.renames["NORMAL_TEXTURE"] = "normal_texture";
1195
actions.renames["SPECULAR_SHININESS_TEXTURE"] = "specular_texture";
1196
actions.renames["SPECULAR_SHININESS"] = "specular_shininess";
1197
actions.renames["SCREEN_UV"] = "screen_uv";
1198
actions.renames["REGION_RECT"] = "region_rect";
1199
actions.renames["SCREEN_PIXEL_SIZE"] = "screen_pixel_size";
1200
actions.renames["FRAGCOORD"] = "gl_FragCoord";
1201
actions.renames["POINT_COORD"] = "gl_PointCoord";
1202
actions.renames["INSTANCE_ID"] = "gl_InstanceID";
1203
actions.renames["VERTEX_ID"] = "gl_VertexID";
1204
1205
actions.renames["CUSTOM0"] = "custom0";
1206
actions.renames["CUSTOM1"] = "custom1";
1207
1208
actions.renames["LIGHT_POSITION"] = "light_position";
1209
actions.renames["LIGHT_DIRECTION"] = "light_direction";
1210
actions.renames["LIGHT_IS_DIRECTIONAL"] = "is_directional";
1211
actions.renames["LIGHT_COLOR"] = "light_color";
1212
actions.renames["LIGHT_ENERGY"] = "light_energy";
1213
actions.renames["LIGHT"] = "light";
1214
actions.renames["SHADOW_MODULATE"] = "shadow_modulate";
1215
1216
actions.renames["texture_sdf"] = "texture_sdf";
1217
actions.renames["texture_sdf_normal"] = "texture_sdf_normal";
1218
actions.renames["sdf_to_screen_uv"] = "sdf_to_screen_uv";
1219
actions.renames["screen_uv_to_sdf"] = "screen_uv_to_sdf";
1220
1221
actions.usage_defines["COLOR"] = "#define COLOR_USED\n";
1222
actions.usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n";
1223
actions.usage_defines["SCREEN_PIXEL_SIZE"] = "@SCREEN_UV";
1224
actions.usage_defines["NORMAL"] = "#define NORMAL_USED\n";
1225
actions.usage_defines["NORMAL_MAP"] = "#define NORMAL_MAP_USED\n";
1226
actions.usage_defines["SPECULAR_SHININESS"] = "#define SPECULAR_SHININESS_USED\n";
1227
actions.usage_defines["CUSTOM0"] = "#define CUSTOM0_USED\n";
1228
actions.usage_defines["CUSTOM1"] = "#define CUSTOM1_USED\n";
1229
1230
actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
1231
actions.render_mode_defines["unshaded"] = "#define MODE_UNSHADED\n";
1232
actions.render_mode_defines["light_only"] = "#define MODE_LIGHT_ONLY\n";
1233
actions.render_mode_defines["world_vertex_coords"] = "#define USE_WORLD_VERTEX_COORDS\n";
1234
1235
actions.global_buffer_array_variable = "global_shader_uniforms";
1236
actions.instance_uniform_index_variable = "read_draw_data_instance_offset";
1237
1238
shaders.compiler_canvas.initialize(actions);
1239
}
1240
1241
{
1242
// Setup Scene compiler
1243
1244
//shader compiler
1245
ShaderCompiler::DefaultIdentifierActions actions;
1246
1247
actions.renames["MODEL_MATRIX"] = "model_matrix";
1248
actions.renames["MODEL_NORMAL_MATRIX"] = "model_normal_matrix";
1249
actions.renames["VIEW_MATRIX"] = "scene_data_block.data.view_matrix";
1250
actions.renames["INV_VIEW_MATRIX"] = "scene_data_block.data.inv_view_matrix";
1251
actions.renames["PROJECTION_MATRIX"] = "projection_matrix";
1252
actions.renames["INV_PROJECTION_MATRIX"] = "inv_projection_matrix";
1253
actions.renames["MODELVIEW_MATRIX"] = "modelview";
1254
actions.renames["MODELVIEW_NORMAL_MATRIX"] = "modelview_normal";
1255
actions.renames["MAIN_CAM_INV_VIEW_MATRIX"] = "scene_data_block.data.main_cam_inv_view_matrix";
1256
1257
actions.renames["VERTEX"] = "vertex";
1258
actions.renames["NORMAL"] = "normal";
1259
actions.renames["TANGENT"] = "tangent";
1260
actions.renames["BINORMAL"] = "binormal";
1261
actions.renames["POSITION"] = "position";
1262
actions.renames["UV"] = "uv_interp";
1263
actions.renames["UV2"] = "uv2_interp";
1264
actions.renames["COLOR"] = "color_interp";
1265
actions.renames["POINT_SIZE"] = "point_size";
1266
actions.renames["INSTANCE_ID"] = "gl_InstanceID";
1267
actions.renames["VERTEX_ID"] = "gl_VertexID";
1268
actions.renames["Z_CLIP_SCALE"] = "z_clip_scale";
1269
1270
actions.renames["ALPHA_SCISSOR_THRESHOLD"] = "alpha_scissor_threshold";
1271
actions.renames["ALPHA_HASH_SCALE"] = "alpha_hash_scale";
1272
actions.renames["ALPHA_ANTIALIASING_EDGE"] = "alpha_antialiasing_edge";
1273
actions.renames["ALPHA_TEXTURE_COORDINATE"] = "alpha_texture_coordinate";
1274
1275
//builtins
1276
1277
actions.renames["TIME"] = "scene_data_block.data.time";
1278
actions.renames["EXPOSURE"] = "(1.0 / scene_data_block.data.emissive_exposure_normalization)";
1279
actions.renames["PI"] = String::num(Math::PI);
1280
actions.renames["TAU"] = String::num(Math::TAU);
1281
actions.renames["E"] = String::num(Math::E);
1282
actions.renames["OUTPUT_IS_SRGB"] = "SHADER_IS_SRGB";
1283
actions.renames["CLIP_SPACE_FAR"] = "SHADER_SPACE_FAR";
1284
actions.renames["IN_SHADOW_PASS"] = "IN_SHADOW_PASS";
1285
actions.renames["VIEWPORT_SIZE"] = "scene_data_block.data.viewport_size";
1286
1287
actions.renames["FRAGCOORD"] = "gl_FragCoord";
1288
actions.renames["FRONT_FACING"] = "gl_FrontFacing";
1289
actions.renames["NORMAL_MAP"] = "normal_map";
1290
actions.renames["NORMAL_MAP_DEPTH"] = "normal_map_depth";
1291
actions.renames["BENT_NORMAL_MAP"] = "bent_normal_map";
1292
actions.renames["ALBEDO"] = "albedo";
1293
actions.renames["ALPHA"] = "alpha";
1294
actions.renames["PREMUL_ALPHA_FACTOR"] = "premul_alpha";
1295
actions.renames["METALLIC"] = "metallic";
1296
actions.renames["SPECULAR"] = "specular";
1297
actions.renames["ROUGHNESS"] = "roughness";
1298
actions.renames["RIM"] = "rim";
1299
actions.renames["RIM_TINT"] = "rim_tint";
1300
actions.renames["CLEARCOAT"] = "clearcoat";
1301
actions.renames["CLEARCOAT_ROUGHNESS"] = "clearcoat_roughness";
1302
actions.renames["ANISOTROPY"] = "anisotropy";
1303
actions.renames["ANISOTROPY_FLOW"] = "anisotropy_flow";
1304
actions.renames["SSS_STRENGTH"] = "sss_strength";
1305
actions.renames["SSS_TRANSMITTANCE_COLOR"] = "transmittance_color";
1306
actions.renames["SSS_TRANSMITTANCE_DEPTH"] = "transmittance_depth";
1307
actions.renames["SSS_TRANSMITTANCE_BOOST"] = "transmittance_boost";
1308
actions.renames["BACKLIGHT"] = "backlight";
1309
actions.renames["AO"] = "ao";
1310
actions.renames["AO_LIGHT_AFFECT"] = "ao_light_affect";
1311
actions.renames["EMISSION"] = "emission";
1312
actions.renames["POINT_COORD"] = "gl_PointCoord";
1313
actions.renames["INSTANCE_CUSTOM"] = "instance_custom";
1314
actions.renames["SCREEN_UV"] = "screen_uv";
1315
actions.renames["DEPTH"] = "gl_FragDepth";
1316
actions.renames["FOG"] = "fog";
1317
actions.renames["RADIANCE"] = "custom_radiance";
1318
actions.renames["IRRADIANCE"] = "custom_irradiance";
1319
actions.renames["BONE_INDICES"] = "bone_attrib";
1320
actions.renames["BONE_WEIGHTS"] = "weight_attrib";
1321
actions.renames["CUSTOM0"] = "custom0_attrib";
1322
actions.renames["CUSTOM1"] = "custom1_attrib";
1323
actions.renames["CUSTOM2"] = "custom2_attrib";
1324
actions.renames["CUSTOM3"] = "custom3_attrib";
1325
actions.renames["LIGHT_VERTEX"] = "light_vertex";
1326
1327
actions.renames["NODE_POSITION_WORLD"] = "model_matrix[3].xyz";
1328
actions.renames["CAMERA_POSITION_WORLD"] = "scene_data_block.data.inv_view_matrix[3].xyz";
1329
actions.renames["CAMERA_DIRECTION_WORLD"] = "scene_data_block.data.inv_view_matrix[2].xyz";
1330
actions.renames["CAMERA_VISIBLE_LAYERS"] = "scene_data_block.data.camera_visible_layers";
1331
actions.renames["NODE_POSITION_VIEW"] = "(scene_data_block.data.view_matrix * model_matrix)[3].xyz";
1332
1333
actions.renames["IS_MULTIVIEW"] = "OUTPUT_IS_MULTIVIEW";
1334
actions.renames["VIEW_INDEX"] = "ViewIndex";
1335
actions.renames["VIEW_MONO_LEFT"] = "uint(0)";
1336
actions.renames["VIEW_RIGHT"] = "uint(1)";
1337
actions.renames["EYE_OFFSET"] = "eye_offset";
1338
1339
//for light
1340
actions.renames["VIEW"] = "view";
1341
actions.renames["SPECULAR_AMOUNT"] = "specular_amount";
1342
actions.renames["LIGHT_COLOR"] = "light_color";
1343
actions.renames["LIGHT_IS_DIRECTIONAL"] = "is_directional";
1344
actions.renames["LIGHT"] = "light";
1345
actions.renames["ATTENUATION"] = "attenuation";
1346
actions.renames["DIFFUSE_LIGHT"] = "diffuse_light";
1347
actions.renames["SPECULAR_LIGHT"] = "specular_light";
1348
1349
actions.usage_defines["NORMAL"] = "#define NORMAL_USED\n";
1350
actions.usage_defines["TANGENT"] = "#define TANGENT_USED\n";
1351
actions.usage_defines["BINORMAL"] = "@TANGENT";
1352
actions.usage_defines["RIM"] = "#define LIGHT_RIM_USED\n";
1353
actions.usage_defines["RIM_TINT"] = "@RIM";
1354
actions.usage_defines["CLEARCOAT"] = "#define LIGHT_CLEARCOAT_USED\n";
1355
actions.usage_defines["CLEARCOAT_ROUGHNESS"] = "@CLEARCOAT";
1356
actions.usage_defines["ANISOTROPY"] = "#define LIGHT_ANISOTROPY_USED\n";
1357
actions.usage_defines["ANISOTROPY_FLOW"] = "@ANISOTROPY";
1358
actions.usage_defines["AO"] = "#define AO_USED\n";
1359
actions.usage_defines["AO_LIGHT_AFFECT"] = "#define AO_USED\n";
1360
actions.usage_defines["UV"] = "#define UV_USED\n";
1361
actions.usage_defines["UV2"] = "#define UV2_USED\n";
1362
actions.usage_defines["BONE_INDICES"] = "#define BONES_USED\n";
1363
actions.usage_defines["BONE_WEIGHTS"] = "#define WEIGHTS_USED\n";
1364
actions.usage_defines["CUSTOM0"] = "#define CUSTOM0_USED\n";
1365
actions.usage_defines["CUSTOM1"] = "#define CUSTOM1_USED\n";
1366
actions.usage_defines["CUSTOM2"] = "#define CUSTOM2_USED\n";
1367
actions.usage_defines["CUSTOM3"] = "#define CUSTOM3_USED\n";
1368
actions.usage_defines["NORMAL_MAP"] = "#define NORMAL_MAP_USED\n";
1369
actions.usage_defines["NORMAL_MAP_DEPTH"] = "@NORMAL_MAP";
1370
actions.usage_defines["BENT_NORMAL_MAP"] = "#define BENT_NORMAL_MAP_USED\n";
1371
actions.usage_defines["COLOR"] = "#define COLOR_USED\n";
1372
actions.usage_defines["INSTANCE_CUSTOM"] = "#define ENABLE_INSTANCE_CUSTOM\n";
1373
actions.usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n";
1374
actions.usage_defines["LIGHT_VERTEX"] = "#define LIGHT_VERTEX_USED\n";
1375
actions.usage_defines["Z_CLIP_SCALE"] = "#define Z_CLIP_SCALE_USED\n";
1376
1377
actions.usage_defines["ALPHA_SCISSOR_THRESHOLD"] = "#define ALPHA_SCISSOR_USED\n";
1378
actions.usage_defines["ALPHA_HASH_SCALE"] = "#define ALPHA_HASH_USED\n";
1379
actions.usage_defines["ALPHA_ANTIALIASING_EDGE"] = "#define ALPHA_ANTIALIASING_EDGE_USED\n";
1380
actions.usage_defines["ALPHA_TEXTURE_COORDINATE"] = "@ALPHA_ANTIALIASING_EDGE";
1381
actions.usage_defines["PREMULT_ALPHA_FACTOR"] = "#define PREMULT_ALPHA_USED";
1382
1383
actions.usage_defines["SSS_STRENGTH"] = "#define ENABLE_SSS\n";
1384
actions.usage_defines["SSS_TRANSMITTANCE_DEPTH"] = "#define ENABLE_TRANSMITTANCE\n";
1385
actions.usage_defines["BACKLIGHT"] = "#define LIGHT_BACKLIGHT_USED\n";
1386
actions.usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n";
1387
1388
actions.usage_defines["FOG"] = "#define CUSTOM_FOG_USED\n";
1389
actions.usage_defines["RADIANCE"] = "#define CUSTOM_RADIANCE_USED\n";
1390
actions.usage_defines["IRRADIANCE"] = "#define CUSTOM_IRRADIANCE_USED\n";
1391
1392
actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
1393
actions.render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n";
1394
actions.render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n";
1395
actions.render_mode_defines["cull_front"] = "#define DO_SIDE_CHECK\n";
1396
actions.render_mode_defines["cull_disabled"] = "#define DO_SIDE_CHECK\n";
1397
actions.render_mode_defines["particle_trails"] = "#define USE_PARTICLE_TRAILS\n";
1398
actions.render_mode_defines["depth_prepass_alpha"] = "#define USE_OPAQUE_PREPASS\n";
1399
1400
bool force_lambert = GLOBAL_GET("rendering/shading/overrides/force_lambert_over_burley");
1401
1402
if (!force_lambert) {
1403
actions.render_mode_defines["diffuse_burley"] = "#define DIFFUSE_BURLEY\n";
1404
}
1405
1406
actions.render_mode_defines["diffuse_lambert_wrap"] = "#define DIFFUSE_LAMBERT_WRAP\n";
1407
actions.render_mode_defines["diffuse_toon"] = "#define DIFFUSE_TOON\n";
1408
1409
actions.render_mode_defines["sss_mode_skin"] = "#define SSS_MODE_SKIN\n";
1410
1411
actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
1412
actions.render_mode_defines["specular_toon"] = "#define SPECULAR_TOON\n";
1413
actions.render_mode_defines["specular_disabled"] = "#define SPECULAR_DISABLED\n";
1414
actions.render_mode_defines["shadows_disabled"] = "#define SHADOWS_DISABLED\n";
1415
actions.render_mode_defines["ambient_light_disabled"] = "#define AMBIENT_LIGHT_DISABLED\n";
1416
actions.render_mode_defines["shadow_to_opacity"] = "#define USE_SHADOW_TO_OPACITY\n";
1417
actions.render_mode_defines["unshaded"] = "#define MODE_UNSHADED\n";
1418
if (!GLES3::Config::get_singleton()->force_vertex_shading) {
1419
// If forcing vertex shading, this will be defined already.
1420
actions.render_mode_defines["vertex_lighting"] = "#define USE_VERTEX_LIGHTING\n";
1421
}
1422
actions.render_mode_defines["fog_disabled"] = "#define FOG_DISABLED\n";
1423
1424
actions.render_mode_defines["specular_occlusion_disabled"] = "#define SPECULAR_OCCLUSION_DISABLED\n";
1425
1426
actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP;
1427
actions.default_repeat = ShaderLanguage::REPEAT_ENABLE;
1428
1429
actions.apply_luminance_multiplier = true; // apply luminance multiplier to screen texture
1430
actions.check_multiview_samplers = RasterizerGLES3::get_singleton()->is_xr_enabled();
1431
actions.global_buffer_array_variable = "global_shader_uniforms";
1432
actions.instance_uniform_index_variable = "instance_offset";
1433
1434
shaders.compiler_scene.initialize(actions);
1435
}
1436
1437
{
1438
// Setup Particles compiler
1439
1440
ShaderCompiler::DefaultIdentifierActions actions;
1441
1442
actions.renames["COLOR"] = "out_color";
1443
actions.renames["VELOCITY"] = "out_velocity_flags.xyz";
1444
actions.renames["MASS"] = "mass";
1445
actions.renames["ACTIVE"] = "particle_active";
1446
actions.renames["RESTART"] = "restart";
1447
actions.renames["CUSTOM"] = "out_custom";
1448
for (int i = 0; i < PARTICLES_MAX_USERDATAS; i++) {
1449
String udname = "USERDATA" + itos(i + 1);
1450
actions.renames[udname] = "out_userdata" + itos(i + 1);
1451
actions.usage_defines[udname] = "#define USERDATA" + itos(i + 1) + "_USED\n";
1452
}
1453
actions.renames["TRANSFORM"] = "xform";
1454
actions.renames["TIME"] = "time";
1455
actions.renames["PI"] = String::num(Math::PI);
1456
actions.renames["TAU"] = String::num(Math::TAU);
1457
actions.renames["E"] = String::num(Math::E);
1458
actions.renames["LIFETIME"] = "lifetime";
1459
actions.renames["DELTA"] = "local_delta";
1460
actions.renames["NUMBER"] = "particle_number";
1461
actions.renames["INDEX"] = "index";
1462
actions.renames["AMOUNT_RATIO"] = "amount_ratio";
1463
//actions.renames["GRAVITY"] = "current_gravity";
1464
actions.renames["EMISSION_TRANSFORM"] = "emission_transform";
1465
actions.renames["RANDOM_SEED"] = "random_seed";
1466
actions.renames["RESTART_POSITION"] = "restart_position";
1467
actions.renames["RESTART_ROT_SCALE"] = "restart_rotation_scale";
1468
actions.renames["RESTART_VELOCITY"] = "restart_velocity";
1469
actions.renames["RESTART_COLOR"] = "restart_color";
1470
actions.renames["RESTART_CUSTOM"] = "restart_custom";
1471
actions.renames["COLLIDED"] = "collided";
1472
actions.renames["COLLISION_NORMAL"] = "collision_normal";
1473
actions.renames["COLLISION_DEPTH"] = "collision_depth";
1474
actions.renames["ATTRACTOR_FORCE"] = "attractor_force";
1475
actions.renames["EMITTER_VELOCITY"] = "emitter_velocity";
1476
actions.renames["INTERPOLATE_TO_END"] = "interp_to_end";
1477
1478
// These are unsupported, but may be used by users. To avoid compile time overhead, we add the stub only when used.
1479
actions.renames["FLAG_EMIT_POSITION"] = "uint(1)";
1480
actions.renames["FLAG_EMIT_ROT_SCALE"] = "uint(2)";
1481
actions.renames["FLAG_EMIT_VELOCITY"] = "uint(4)";
1482
actions.renames["FLAG_EMIT_COLOR"] = "uint(8)";
1483
actions.renames["FLAG_EMIT_CUSTOM"] = "uint(16)";
1484
actions.renames["emit_subparticle"] = "emit_subparticle";
1485
actions.usage_defines["emit_subparticle"] = "\nbool emit_subparticle(mat4 p_xform, vec3 p_velocity, vec4 p_color, vec4 p_custom, uint p_flags) {\n\treturn false;\n}\n";
1486
1487
actions.render_mode_defines["disable_force"] = "#define DISABLE_FORCE\n";
1488
actions.render_mode_defines["disable_velocity"] = "#define DISABLE_VELOCITY\n";
1489
actions.render_mode_defines["keep_data"] = "#define ENABLE_KEEP_DATA\n";
1490
actions.render_mode_defines["collision_use_scale"] = "#define USE_COLLISION_SCALE\n";
1491
1492
actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP;
1493
actions.default_repeat = ShaderLanguage::REPEAT_ENABLE;
1494
1495
actions.global_buffer_array_variable = "global_shader_uniforms";
1496
1497
shaders.compiler_particles.initialize(actions);
1498
}
1499
1500
{
1501
// Setup Sky compiler
1502
ShaderCompiler::DefaultIdentifierActions actions;
1503
1504
actions.renames["COLOR"] = "color";
1505
actions.renames["ALPHA"] = "alpha";
1506
actions.renames["EYEDIR"] = "cube_normal";
1507
actions.renames["POSITION"] = "position";
1508
actions.renames["SKY_COORDS"] = "panorama_coords";
1509
actions.renames["SCREEN_UV"] = "uv";
1510
actions.renames["TIME"] = "time";
1511
actions.renames["FRAGCOORD"] = "gl_FragCoord";
1512
actions.renames["PI"] = String::num(Math::PI);
1513
actions.renames["TAU"] = String::num(Math::TAU);
1514
actions.renames["E"] = String::num(Math::E);
1515
actions.renames["HALF_RES_COLOR"] = "half_res_color";
1516
actions.renames["QUARTER_RES_COLOR"] = "quarter_res_color";
1517
actions.renames["RADIANCE"] = "radiance";
1518
actions.renames["FOG"] = "custom_fog";
1519
actions.renames["LIGHT0_ENABLED"] = "bool(directional_lights.data[0].enabled_bake_mode & DIRECTIONAL_LIGHT_ENABLED)";
1520
actions.renames["LIGHT0_DIRECTION"] = "directional_lights.data[0].direction_energy.xyz";
1521
actions.renames["LIGHT0_ENERGY"] = "directional_lights.data[0].direction_energy.w";
1522
actions.renames["LIGHT0_COLOR"] = "directional_lights.data[0].color_size.xyz";
1523
actions.renames["LIGHT0_SIZE"] = "directional_lights.data[0].color_size.w";
1524
actions.renames["LIGHT1_ENABLED"] = "bool(directional_lights.data[1].enabled_bake_mode & DIRECTIONAL_LIGHT_ENABLED)";
1525
actions.renames["LIGHT1_DIRECTION"] = "directional_lights.data[1].direction_energy.xyz";
1526
actions.renames["LIGHT1_ENERGY"] = "directional_lights.data[1].direction_energy.w";
1527
actions.renames["LIGHT1_COLOR"] = "directional_lights.data[1].color_size.xyz";
1528
actions.renames["LIGHT1_SIZE"] = "directional_lights.data[1].color_size.w";
1529
actions.renames["LIGHT2_ENABLED"] = "bool(directional_lights.data[2].enabled_bake_mode & DIRECTIONAL_LIGHT_ENABLED)";
1530
actions.renames["LIGHT2_DIRECTION"] = "directional_lights.data[2].direction_energy.xyz";
1531
actions.renames["LIGHT2_ENERGY"] = "directional_lights.data[2].direction_energy.w";
1532
actions.renames["LIGHT2_COLOR"] = "directional_lights.data[2].color_size.xyz";
1533
actions.renames["LIGHT2_SIZE"] = "directional_lights.data[2].color_size.w";
1534
actions.renames["LIGHT3_ENABLED"] = "bool(directional_lights.data[3].enabled_bake_mode & DIRECTIONAL_LIGHT_ENABLED)";
1535
actions.renames["LIGHT3_DIRECTION"] = "directional_lights.data[3].direction_energy.xyz";
1536
actions.renames["LIGHT3_ENERGY"] = "directional_lights.data[3].direction_energy.w";
1537
actions.renames["LIGHT3_COLOR"] = "directional_lights.data[3].color_size.xyz";
1538
actions.renames["LIGHT3_SIZE"] = "directional_lights.data[3].color_size.w";
1539
actions.renames["AT_CUBEMAP_PASS"] = "AT_CUBEMAP_PASS";
1540
actions.renames["AT_HALF_RES_PASS"] = "AT_HALF_RES_PASS";
1541
actions.renames["AT_QUARTER_RES_PASS"] = "AT_QUARTER_RES_PASS";
1542
actions.usage_defines["HALF_RES_COLOR"] = "\n#define USES_HALF_RES_COLOR\n";
1543
actions.usage_defines["QUARTER_RES_COLOR"] = "\n#define USES_QUARTER_RES_COLOR\n";
1544
actions.render_mode_defines["disable_fog"] = "#define DISABLE_FOG\n";
1545
actions.render_mode_defines["use_debanding"] = "#define USE_DEBANDING\n";
1546
1547
actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP;
1548
actions.default_repeat = ShaderLanguage::REPEAT_ENABLE;
1549
1550
actions.global_buffer_array_variable = "global_shader_uniforms";
1551
1552
shaders.compiler_sky.initialize(actions);
1553
}
1554
1555
{
1556
// Setup TextureBlit compiler
1557
ShaderCompiler::DefaultIdentifierActions actions;
1558
1559
actions.renames["TIME"] = "time";
1560
actions.renames["PI"] = _MKSTR(Math_PI);
1561
actions.renames["TAU"] = _MKSTR(Math_TAU);
1562
actions.renames["E"] = _MKSTR(Math_E);
1563
1564
actions.renames["FRAGCOORD"] = "gl_FragCoord";
1565
1566
actions.renames["UV"] = "uv";
1567
actions.renames["MODULATE"] = "modulate";
1568
1569
actions.renames["COLOR0"] = "color0";
1570
actions.renames["COLOR1"] = "color1";
1571
actions.renames["COLOR2"] = "color2";
1572
actions.renames["COLOR3"] = "color3";
1573
1574
shaders.compiler_tex_blit.initialize(actions);
1575
}
1576
}
1577
1578
MaterialStorage::~MaterialStorage() {
1579
//shaders.copy.version_free(shaders.copy_version);
1580
1581
memdelete_arr(global_shader_uniforms.buffer_values);
1582
memdelete_arr(global_shader_uniforms.buffer_usage);
1583
memdelete_arr(global_shader_uniforms.buffer_dirty_regions);
1584
glDeleteBuffers(1, &global_shader_uniforms.buffer);
1585
1586
singleton = nullptr;
1587
}
1588
1589
/* GLOBAL SHADER UNIFORM API */
1590
1591
int32_t MaterialStorage::_global_shader_uniform_allocate(uint32_t p_elements) {
1592
int32_t idx = 0;
1593
while (idx + p_elements <= global_shader_uniforms.buffer_size) {
1594
if (global_shader_uniforms.buffer_usage[idx].elements == 0) {
1595
bool valid = true;
1596
for (uint32_t i = 1; i < p_elements; i++) {
1597
if (global_shader_uniforms.buffer_usage[idx + i].elements > 0) {
1598
valid = false;
1599
idx += i + global_shader_uniforms.buffer_usage[idx + i].elements;
1600
break;
1601
}
1602
}
1603
1604
if (!valid) {
1605
continue; //if not valid, idx is in new position
1606
}
1607
1608
return idx;
1609
} else {
1610
idx += global_shader_uniforms.buffer_usage[idx].elements;
1611
}
1612
}
1613
1614
return -1;
1615
}
1616
1617
void MaterialStorage::_global_shader_uniform_store_in_buffer(int32_t p_index, RS::GlobalShaderParameterType p_type, const Variant &p_value) {
1618
switch (p_type) {
1619
case RS::GLOBAL_VAR_TYPE_BOOL: {
1620
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1621
bool b = p_value;
1622
bv.x = b ? 1.0 : 0.0;
1623
bv.y = 0.0;
1624
bv.z = 0.0;
1625
bv.w = 0.0;
1626
1627
} break;
1628
case RS::GLOBAL_VAR_TYPE_BVEC2: {
1629
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1630
uint32_t bvec = p_value;
1631
bv.x = (bvec & 1) ? 1.0 : 0.0;
1632
bv.y = (bvec & 2) ? 1.0 : 0.0;
1633
bv.z = 0.0;
1634
bv.w = 0.0;
1635
} break;
1636
case RS::GLOBAL_VAR_TYPE_BVEC3: {
1637
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1638
uint32_t bvec = p_value;
1639
bv.x = (bvec & 1) ? 1.0 : 0.0;
1640
bv.y = (bvec & 2) ? 1.0 : 0.0;
1641
bv.z = (bvec & 4) ? 1.0 : 0.0;
1642
bv.w = 0.0;
1643
} break;
1644
case RS::GLOBAL_VAR_TYPE_BVEC4: {
1645
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1646
uint32_t bvec = p_value;
1647
bv.x = (bvec & 1) ? 1.0 : 0.0;
1648
bv.y = (bvec & 2) ? 1.0 : 0.0;
1649
bv.z = (bvec & 4) ? 1.0 : 0.0;
1650
bv.w = (bvec & 8) ? 1.0 : 0.0;
1651
} break;
1652
case RS::GLOBAL_VAR_TYPE_INT: {
1653
GlobalShaderUniforms::ValueInt &bv = *(GlobalShaderUniforms::ValueInt *)&global_shader_uniforms.buffer_values[p_index];
1654
int32_t v = p_value;
1655
bv.x = v;
1656
bv.y = 0;
1657
bv.z = 0;
1658
bv.w = 0;
1659
} break;
1660
case RS::GLOBAL_VAR_TYPE_IVEC2: {
1661
GlobalShaderUniforms::ValueInt &bv = *(GlobalShaderUniforms::ValueInt *)&global_shader_uniforms.buffer_values[p_index];
1662
Vector2i v = convert_to_vector<Vector2i>(p_value);
1663
bv.x = v.x;
1664
bv.y = v.y;
1665
bv.z = 0;
1666
bv.w = 0;
1667
} break;
1668
case RS::GLOBAL_VAR_TYPE_IVEC3: {
1669
GlobalShaderUniforms::ValueInt &bv = *(GlobalShaderUniforms::ValueInt *)&global_shader_uniforms.buffer_values[p_index];
1670
Vector3i v = convert_to_vector<Vector3i>(p_value);
1671
bv.x = v.x;
1672
bv.y = v.y;
1673
bv.z = v.z;
1674
bv.w = 0;
1675
} break;
1676
case RS::GLOBAL_VAR_TYPE_IVEC4: {
1677
GlobalShaderUniforms::ValueInt &bv = *(GlobalShaderUniforms::ValueInt *)&global_shader_uniforms.buffer_values[p_index];
1678
Vector4i v = convert_to_vector<Vector4i>(p_value);
1679
bv.x = v.x;
1680
bv.y = v.y;
1681
bv.z = v.z;
1682
bv.w = v.w;
1683
} break;
1684
case RS::GLOBAL_VAR_TYPE_RECT2I: {
1685
GlobalShaderUniforms::ValueInt &bv = *(GlobalShaderUniforms::ValueInt *)&global_shader_uniforms.buffer_values[p_index];
1686
Rect2i v = p_value;
1687
bv.x = v.position.x;
1688
bv.y = v.position.y;
1689
bv.z = v.size.x;
1690
bv.w = v.size.y;
1691
} break;
1692
case RS::GLOBAL_VAR_TYPE_UINT: {
1693
GlobalShaderUniforms::ValueUInt &bv = *(GlobalShaderUniforms::ValueUInt *)&global_shader_uniforms.buffer_values[p_index];
1694
uint32_t v = p_value;
1695
bv.x = v;
1696
bv.y = 0;
1697
bv.z = 0;
1698
bv.w = 0;
1699
} break;
1700
case RS::GLOBAL_VAR_TYPE_UVEC2: {
1701
GlobalShaderUniforms::ValueUInt &bv = *(GlobalShaderUniforms::ValueUInt *)&global_shader_uniforms.buffer_values[p_index];
1702
Vector2i v = convert_to_vector<Vector2i>(p_value);
1703
bv.x = v.x;
1704
bv.y = v.y;
1705
bv.z = 0;
1706
bv.w = 0;
1707
} break;
1708
case RS::GLOBAL_VAR_TYPE_UVEC3: {
1709
GlobalShaderUniforms::ValueUInt &bv = *(GlobalShaderUniforms::ValueUInt *)&global_shader_uniforms.buffer_values[p_index];
1710
Vector3i v = convert_to_vector<Vector3i>(p_value);
1711
bv.x = v.x;
1712
bv.y = v.y;
1713
bv.z = v.z;
1714
bv.w = 0;
1715
} break;
1716
case RS::GLOBAL_VAR_TYPE_UVEC4: {
1717
GlobalShaderUniforms::ValueUInt &bv = *(GlobalShaderUniforms::ValueUInt *)&global_shader_uniforms.buffer_values[p_index];
1718
Vector4i v = convert_to_vector<Vector4i>(p_value);
1719
bv.x = v.x;
1720
bv.y = v.y;
1721
bv.z = v.z;
1722
bv.w = v.w;
1723
} break;
1724
case RS::GLOBAL_VAR_TYPE_FLOAT: {
1725
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1726
float v = p_value;
1727
bv.x = v;
1728
bv.y = 0;
1729
bv.z = 0;
1730
bv.w = 0;
1731
} break;
1732
case RS::GLOBAL_VAR_TYPE_VEC2: {
1733
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1734
Vector2 v = convert_to_vector<Vector2>(p_value);
1735
bv.x = v.x;
1736
bv.y = v.y;
1737
bv.z = 0;
1738
bv.w = 0;
1739
} break;
1740
case RS::GLOBAL_VAR_TYPE_VEC3: {
1741
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1742
Vector3 v = convert_to_vector<Vector3>(p_value);
1743
bv.x = v.x;
1744
bv.y = v.y;
1745
bv.z = v.z;
1746
bv.w = 0;
1747
} break;
1748
case RS::GLOBAL_VAR_TYPE_VEC4: {
1749
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1750
Vector4 v = convert_to_vector<Vector4>(p_value);
1751
bv.x = v.x;
1752
bv.y = v.y;
1753
bv.z = v.z;
1754
bv.w = v.w;
1755
} break;
1756
case RS::GLOBAL_VAR_TYPE_COLOR: {
1757
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1758
Color v = p_value;
1759
bv.x = v.r;
1760
bv.y = v.g;
1761
bv.z = v.b;
1762
bv.w = v.a;
1763
1764
GlobalShaderUniforms::Value &bv_linear = global_shader_uniforms.buffer_values[p_index + 1];
1765
//v = v.srgb_to_linear();
1766
bv_linear.x = v.r;
1767
bv_linear.y = v.g;
1768
bv_linear.z = v.b;
1769
bv_linear.w = v.a;
1770
1771
} break;
1772
case RS::GLOBAL_VAR_TYPE_RECT2: {
1773
GlobalShaderUniforms::Value &bv = global_shader_uniforms.buffer_values[p_index];
1774
Rect2 v = p_value;
1775
bv.x = v.position.x;
1776
bv.y = v.position.y;
1777
bv.z = v.size.x;
1778
bv.w = v.size.y;
1779
} break;
1780
case RS::GLOBAL_VAR_TYPE_MAT2: {
1781
GlobalShaderUniforms::Value *bv = &global_shader_uniforms.buffer_values[p_index];
1782
Vector<float> m2 = p_value;
1783
if (m2.size() < 4) {
1784
m2.resize(4);
1785
}
1786
bv[0].x = m2[0];
1787
bv[0].y = m2[1];
1788
bv[0].z = 0;
1789
bv[0].w = 0;
1790
1791
bv[1].x = m2[2];
1792
bv[1].y = m2[3];
1793
bv[1].z = 0;
1794
bv[1].w = 0;
1795
1796
} break;
1797
case RS::GLOBAL_VAR_TYPE_MAT3: {
1798
GlobalShaderUniforms::Value *bv = &global_shader_uniforms.buffer_values[p_index];
1799
Basis v = p_value;
1800
convert_item_std140<Basis>(v, &bv->x);
1801
1802
} break;
1803
case RS::GLOBAL_VAR_TYPE_MAT4: {
1804
GlobalShaderUniforms::Value *bv = &global_shader_uniforms.buffer_values[p_index];
1805
Projection m = p_value;
1806
convert_item_std140<Projection>(m, &bv->x);
1807
1808
} break;
1809
case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: {
1810
GlobalShaderUniforms::Value *bv = &global_shader_uniforms.buffer_values[p_index];
1811
Transform2D v = p_value;
1812
convert_item_std140<Transform2D>(v, &bv->x);
1813
1814
} break;
1815
case RS::GLOBAL_VAR_TYPE_TRANSFORM: {
1816
GlobalShaderUniforms::Value *bv = &global_shader_uniforms.buffer_values[p_index];
1817
Transform3D v = p_value;
1818
convert_item_std140<Transform3D>(v, &bv->x);
1819
1820
} break;
1821
default: {
1822
ERR_FAIL();
1823
}
1824
}
1825
}
1826
1827
void MaterialStorage::_global_shader_uniform_mark_buffer_dirty(int32_t p_index, int32_t p_elements) {
1828
int32_t prev_chunk = -1;
1829
1830
for (int32_t i = 0; i < p_elements; i++) {
1831
int32_t chunk = (p_index + i) / GlobalShaderUniforms::BUFFER_DIRTY_REGION_SIZE;
1832
if (chunk != prev_chunk) {
1833
if (!global_shader_uniforms.buffer_dirty_regions[chunk]) {
1834
global_shader_uniforms.buffer_dirty_regions[chunk] = true;
1835
global_shader_uniforms.buffer_dirty_region_count++;
1836
}
1837
}
1838
1839
prev_chunk = chunk;
1840
}
1841
}
1842
1843
void MaterialStorage::global_shader_parameter_add(const StringName &p_name, RS::GlobalShaderParameterType p_type, const Variant &p_value) {
1844
ERR_FAIL_COND(global_shader_uniforms.variables.has(p_name));
1845
GlobalShaderUniforms::Variable gv;
1846
gv.type = p_type;
1847
gv.value = p_value;
1848
gv.buffer_index = -1;
1849
1850
if (p_type >= RS::GLOBAL_VAR_TYPE_SAMPLER2D) {
1851
//is texture
1852
global_shader_uniforms.must_update_texture_materials = true; //normally there are none
1853
} else {
1854
gv.buffer_elements = 1;
1855
if (p_type == RS::GLOBAL_VAR_TYPE_COLOR || p_type == RS::GLOBAL_VAR_TYPE_MAT2) {
1856
//color needs to elements to store srgb and linear
1857
gv.buffer_elements = 2;
1858
}
1859
if (p_type == RS::GLOBAL_VAR_TYPE_MAT3 || p_type == RS::GLOBAL_VAR_TYPE_TRANSFORM_2D) {
1860
//color needs to elements to store srgb and linear
1861
gv.buffer_elements = 3;
1862
}
1863
if (p_type == RS::GLOBAL_VAR_TYPE_MAT4 || p_type == RS::GLOBAL_VAR_TYPE_TRANSFORM) {
1864
//color needs to elements to store srgb and linear
1865
gv.buffer_elements = 4;
1866
}
1867
1868
//is vector, allocate in buffer and update index
1869
gv.buffer_index = _global_shader_uniform_allocate(gv.buffer_elements);
1870
ERR_FAIL_COND_MSG(gv.buffer_index < 0, vformat("Failed allocating global variable '%s' out of buffer memory. Consider increasing rendering/limits/global_shader_variables/buffer_size in the Project Settings. Maximum items supported by this hardware is: %d.", String(p_name), Config::get_singleton()->max_uniform_buffer_size / sizeof(GlobalShaderUniforms::Value)));
1871
global_shader_uniforms.buffer_usage[gv.buffer_index].elements = gv.buffer_elements;
1872
_global_shader_uniform_store_in_buffer(gv.buffer_index, gv.type, gv.value);
1873
_global_shader_uniform_mark_buffer_dirty(gv.buffer_index, gv.buffer_elements);
1874
1875
global_shader_uniforms.must_update_buffer_materials = true; //normally there are none
1876
}
1877
1878
global_shader_uniforms.variables[p_name] = gv;
1879
}
1880
1881
void MaterialStorage::global_shader_parameter_remove(const StringName &p_name) {
1882
if (!global_shader_uniforms.variables.has(p_name)) {
1883
return;
1884
}
1885
GlobalShaderUniforms::Variable &gv = global_shader_uniforms.variables[p_name];
1886
1887
if (gv.buffer_index >= 0) {
1888
global_shader_uniforms.buffer_usage[gv.buffer_index].elements = 0;
1889
global_shader_uniforms.must_update_buffer_materials = true;
1890
} else {
1891
global_shader_uniforms.must_update_texture_materials = true;
1892
}
1893
1894
global_shader_uniforms.variables.erase(p_name);
1895
}
1896
1897
Vector<StringName> MaterialStorage::global_shader_parameter_get_list() const {
1898
if (!Engine::get_singleton()->is_editor_hint() && !Engine::get_singleton()->is_project_manager_hint()) {
1899
ERR_FAIL_V_MSG(Vector<StringName>(), "This function should never be used outside the editor, it can severely damage performance.");
1900
}
1901
1902
Vector<StringName> names;
1903
for (const KeyValue<StringName, GlobalShaderUniforms::Variable> &E : global_shader_uniforms.variables) {
1904
names.push_back(E.key);
1905
}
1906
names.sort_custom<StringName::AlphCompare>();
1907
return names;
1908
}
1909
1910
void MaterialStorage::global_shader_parameter_set(const StringName &p_name, const Variant &p_value) {
1911
ERR_FAIL_COND(!global_shader_uniforms.variables.has(p_name));
1912
GlobalShaderUniforms::Variable &gv = global_shader_uniforms.variables[p_name];
1913
gv.value = p_value;
1914
if (gv.override.get_type() == Variant::NIL) {
1915
if (gv.buffer_index >= 0) {
1916
//buffer
1917
_global_shader_uniform_store_in_buffer(gv.buffer_index, gv.type, gv.value);
1918
_global_shader_uniform_mark_buffer_dirty(gv.buffer_index, gv.buffer_elements);
1919
} else {
1920
//texture
1921
MaterialStorage *material_storage = MaterialStorage::get_singleton();
1922
for (const RID &E : gv.texture_materials) {
1923
Material *material = material_storage->get_material(E);
1924
ERR_CONTINUE(!material);
1925
material_storage->_material_queue_update(material, false, true);
1926
}
1927
}
1928
}
1929
}
1930
1931
void MaterialStorage::global_shader_parameter_set_override(const StringName &p_name, const Variant &p_value) {
1932
if (!global_shader_uniforms.variables.has(p_name)) {
1933
return; //variable may not exist
1934
}
1935
1936
ERR_FAIL_COND(p_value.get_type() == Variant::OBJECT);
1937
1938
GlobalShaderUniforms::Variable &gv = global_shader_uniforms.variables[p_name];
1939
1940
gv.override = p_value;
1941
1942
if (gv.buffer_index >= 0) {
1943
//buffer
1944
if (gv.override.get_type() == Variant::NIL) {
1945
_global_shader_uniform_store_in_buffer(gv.buffer_index, gv.type, gv.value);
1946
} else {
1947
_global_shader_uniform_store_in_buffer(gv.buffer_index, gv.type, gv.override);
1948
}
1949
1950
_global_shader_uniform_mark_buffer_dirty(gv.buffer_index, gv.buffer_elements);
1951
} else {
1952
//texture
1953
MaterialStorage *material_storage = MaterialStorage::get_singleton();
1954
for (const RID &E : gv.texture_materials) {
1955
Material *material = material_storage->get_material(E);
1956
ERR_CONTINUE(!material);
1957
material_storage->_material_queue_update(material, false, true);
1958
}
1959
}
1960
}
1961
1962
Variant MaterialStorage::global_shader_parameter_get(const StringName &p_name) const {
1963
if (!Engine::get_singleton()->is_editor_hint()) {
1964
ERR_FAIL_V_MSG(Variant(), "This function should never be used outside the editor, it can severely damage performance.");
1965
}
1966
1967
if (!global_shader_uniforms.variables.has(p_name)) {
1968
return Variant();
1969
}
1970
1971
return global_shader_uniforms.variables[p_name].value;
1972
}
1973
1974
RS::GlobalShaderParameterType MaterialStorage::global_shader_parameter_get_type_internal(const StringName &p_name) const {
1975
if (!global_shader_uniforms.variables.has(p_name)) {
1976
return RS::GLOBAL_VAR_TYPE_MAX;
1977
}
1978
1979
return global_shader_uniforms.variables[p_name].type;
1980
}
1981
1982
RS::GlobalShaderParameterType MaterialStorage::global_shader_parameter_get_type(const StringName &p_name) const {
1983
if (!Engine::get_singleton()->is_editor_hint()) {
1984
ERR_FAIL_V_MSG(RS::GLOBAL_VAR_TYPE_MAX, "This function should never be used outside the editor, it can severely damage performance.");
1985
}
1986
1987
return global_shader_parameter_get_type_internal(p_name);
1988
}
1989
1990
void MaterialStorage::global_shader_parameters_load_settings(bool p_load_textures) {
1991
List<PropertyInfo> settings;
1992
ProjectSettings::get_singleton()->get_property_list(&settings);
1993
1994
for (const PropertyInfo &E : settings) {
1995
if (E.name.begins_with("shader_globals/")) {
1996
StringName name = E.name.get_slicec('/', 1);
1997
Dictionary d = GLOBAL_GET(E.name);
1998
1999
ERR_CONTINUE(!d.has("type"));
2000
ERR_CONTINUE(!d.has("value"));
2001
2002
String type = d["type"];
2003
2004
static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = {
2005
"bool",
2006
"bvec2",
2007
"bvec3",
2008
"bvec4",
2009
"int",
2010
"ivec2",
2011
"ivec3",
2012
"ivec4",
2013
"rect2i",
2014
"uint",
2015
"uvec2",
2016
"uvec3",
2017
"uvec4",
2018
"float",
2019
"vec2",
2020
"vec3",
2021
"vec4",
2022
"color",
2023
"rect2",
2024
"mat2",
2025
"mat3",
2026
"mat4",
2027
"transform_2d",
2028
"transform",
2029
"sampler2D",
2030
"sampler2DArray",
2031
"sampler3D",
2032
"samplerCube",
2033
"samplerExternalOES"
2034
};
2035
2036
RS::GlobalShaderParameterType gvtype = RS::GLOBAL_VAR_TYPE_MAX;
2037
2038
for (int i = 0; i < RS::GLOBAL_VAR_TYPE_MAX; i++) {
2039
if (global_var_type_names[i] == type) {
2040
gvtype = RS::GlobalShaderParameterType(i);
2041
break;
2042
}
2043
}
2044
2045
ERR_CONTINUE(gvtype == RS::GLOBAL_VAR_TYPE_MAX); //type invalid
2046
2047
Variant value = d["value"];
2048
2049
if (gvtype >= RS::GLOBAL_VAR_TYPE_SAMPLER2D) {
2050
String path = value;
2051
// Don't load the textures, but still add the parameter so shaders compile correctly while loading.
2052
if (!p_load_textures || path.is_empty()) {
2053
value = RID();
2054
} else {
2055
Ref<Resource> resource = ResourceLoader::load(path);
2056
value = resource;
2057
}
2058
}
2059
2060
if (global_shader_uniforms.variables.has(name)) {
2061
//has it, update it
2062
global_shader_parameter_set(name, value);
2063
} else {
2064
global_shader_parameter_add(name, gvtype, value);
2065
}
2066
}
2067
}
2068
}
2069
2070
void MaterialStorage::global_shader_parameters_clear() {
2071
global_shader_uniforms.variables.clear();
2072
}
2073
2074
GLuint MaterialStorage::global_shader_parameters_get_uniform_buffer() const {
2075
return global_shader_uniforms.buffer;
2076
}
2077
2078
int32_t MaterialStorage::global_shader_parameters_instance_allocate(RID p_instance) {
2079
ERR_FAIL_COND_V(global_shader_uniforms.instance_buffer_pos.has(p_instance), -1);
2080
int32_t pos = _global_shader_uniform_allocate(ShaderLanguage::MAX_INSTANCE_UNIFORM_INDICES);
2081
global_shader_uniforms.instance_buffer_pos[p_instance] = pos; //save anyway
2082
ERR_FAIL_COND_V_MSG(pos < 0, -1, vformat("Too many instances using shader instance variables. Consider increasing rendering/limits/global_shader_variables/buffer_size in the Project Settings. Maximum items supported by this hardware is: %d.", Config::get_singleton()->max_uniform_buffer_size / sizeof(GlobalShaderUniforms::Value)));
2083
global_shader_uniforms.buffer_usage[pos].elements = ShaderLanguage::MAX_INSTANCE_UNIFORM_INDICES;
2084
return pos;
2085
}
2086
2087
void MaterialStorage::global_shader_parameters_instance_free(RID p_instance) {
2088
ERR_FAIL_COND(!global_shader_uniforms.instance_buffer_pos.has(p_instance));
2089
int32_t pos = global_shader_uniforms.instance_buffer_pos[p_instance];
2090
if (pos >= 0) {
2091
global_shader_uniforms.buffer_usage[pos].elements = 0;
2092
}
2093
global_shader_uniforms.instance_buffer_pos.erase(p_instance);
2094
}
2095
2096
void MaterialStorage::global_shader_parameters_instance_update(RID p_instance, int p_index, const Variant &p_value, int p_flags_count) {
2097
if (!global_shader_uniforms.instance_buffer_pos.has(p_instance)) {
2098
return; //just not allocated, ignore
2099
}
2100
int32_t pos = global_shader_uniforms.instance_buffer_pos[p_instance];
2101
2102
if (pos < 0) {
2103
return; //again, not allocated, ignore
2104
}
2105
ERR_FAIL_INDEX(p_index, ShaderLanguage::MAX_INSTANCE_UNIFORM_INDICES);
2106
2107
Variant::Type value_type = p_value.get_type();
2108
ERR_FAIL_COND_MSG(p_value.get_type() > Variant::COLOR, "Unsupported variant type for instance parameter: " + Variant::get_type_name(value_type)); //anything greater not supported
2109
2110
ShaderLanguage::DataType datatype_from_value[Variant::COLOR + 1] = {
2111
ShaderLanguage::TYPE_MAX, //nil
2112
ShaderLanguage::TYPE_BOOL, //bool
2113
ShaderLanguage::TYPE_INT, //int
2114
ShaderLanguage::TYPE_FLOAT, //float
2115
ShaderLanguage::TYPE_MAX, //string
2116
ShaderLanguage::TYPE_VEC2, //vec2
2117
ShaderLanguage::TYPE_IVEC2, //vec2i
2118
ShaderLanguage::TYPE_VEC4, //rect2
2119
ShaderLanguage::TYPE_IVEC4, //rect2i
2120
ShaderLanguage::TYPE_VEC3, // vec3
2121
ShaderLanguage::TYPE_IVEC3, //vec3i
2122
ShaderLanguage::TYPE_MAX, //xform2d not supported here
2123
ShaderLanguage::TYPE_VEC4, //vec4
2124
ShaderLanguage::TYPE_IVEC4, //vec4i
2125
ShaderLanguage::TYPE_VEC4, //plane
2126
ShaderLanguage::TYPE_VEC4, //quat
2127
ShaderLanguage::TYPE_MAX, //aabb not supported here
2128
ShaderLanguage::TYPE_MAX, //basis not supported here
2129
ShaderLanguage::TYPE_MAX, //xform not supported here
2130
ShaderLanguage::TYPE_MAX, //projection not supported here
2131
ShaderLanguage::TYPE_VEC4 //color
2132
};
2133
2134
ShaderLanguage::DataType datatype = ShaderLanguage::TYPE_MAX;
2135
if (value_type == Variant::INT && p_flags_count > 0) {
2136
switch (p_flags_count) {
2137
case 1:
2138
datatype = ShaderLanguage::TYPE_BVEC2;
2139
break;
2140
case 2:
2141
datatype = ShaderLanguage::TYPE_BVEC3;
2142
break;
2143
case 3:
2144
datatype = ShaderLanguage::TYPE_BVEC4;
2145
break;
2146
}
2147
} else {
2148
datatype = datatype_from_value[value_type];
2149
}
2150
2151
ERR_FAIL_COND_MSG(datatype == ShaderLanguage::TYPE_MAX, "Unsupported variant type for instance parameter: " + Variant::get_type_name(value_type)); //anything greater not supported
2152
2153
pos += p_index;
2154
2155
_fill_std140_variant_ubo_value(datatype, 0, p_value, (uint8_t *)&global_shader_uniforms.buffer_values[pos]);
2156
_global_shader_uniform_mark_buffer_dirty(pos, 1);
2157
}
2158
2159
void MaterialStorage::_update_global_shader_uniforms() {
2160
MaterialStorage *material_storage = MaterialStorage::get_singleton();
2161
if (global_shader_uniforms.buffer_dirty_region_count > 0) {
2162
uint32_t total_regions = 1 + (global_shader_uniforms.buffer_size / GlobalShaderUniforms::BUFFER_DIRTY_REGION_SIZE);
2163
if (total_regions / global_shader_uniforms.buffer_dirty_region_count <= 4) {
2164
// 25% of regions dirty, just update all buffer
2165
glBindBuffer(GL_UNIFORM_BUFFER, global_shader_uniforms.buffer);
2166
glBufferData(GL_UNIFORM_BUFFER, sizeof(GlobalShaderUniforms::Value) * global_shader_uniforms.buffer_size, global_shader_uniforms.buffer_values, GL_DYNAMIC_DRAW);
2167
glBindBuffer(GL_UNIFORM_BUFFER, 0);
2168
memset(global_shader_uniforms.buffer_dirty_regions, 0, sizeof(bool) * total_regions);
2169
} else {
2170
uint32_t region_byte_size = sizeof(GlobalShaderUniforms::Value) * GlobalShaderUniforms::BUFFER_DIRTY_REGION_SIZE;
2171
glBindBuffer(GL_UNIFORM_BUFFER, global_shader_uniforms.buffer);
2172
for (uint32_t i = 0; i < total_regions; i++) {
2173
if (global_shader_uniforms.buffer_dirty_regions[i]) {
2174
glBufferSubData(GL_UNIFORM_BUFFER, i * region_byte_size, region_byte_size, &global_shader_uniforms.buffer_values[i * GlobalShaderUniforms::BUFFER_DIRTY_REGION_SIZE]);
2175
global_shader_uniforms.buffer_dirty_regions[i] = false;
2176
}
2177
}
2178
glBindBuffer(GL_UNIFORM_BUFFER, 0);
2179
}
2180
2181
global_shader_uniforms.buffer_dirty_region_count = 0;
2182
}
2183
2184
if (global_shader_uniforms.must_update_buffer_materials) {
2185
// only happens in the case of a buffer variable added or removed,
2186
// so not often.
2187
for (const RID &E : global_shader_uniforms.materials_using_buffer) {
2188
Material *material = material_storage->get_material(E);
2189
ERR_CONTINUE(!material); //wtf
2190
2191
material_storage->_material_queue_update(material, true, false);
2192
}
2193
2194
global_shader_uniforms.must_update_buffer_materials = false;
2195
}
2196
2197
if (global_shader_uniforms.must_update_texture_materials) {
2198
// only happens in the case of a buffer variable added or removed,
2199
// so not often.
2200
for (const RID &E : global_shader_uniforms.materials_using_texture) {
2201
Material *material = material_storage->get_material(E);
2202
ERR_CONTINUE(!material); //wtf
2203
2204
material_storage->_material_queue_update(material, false, true);
2205
}
2206
2207
global_shader_uniforms.must_update_texture_materials = false;
2208
}
2209
}
2210
2211
/* SHADER API */
2212
2213
RID MaterialStorage::shader_allocate() {
2214
return shader_owner.allocate_rid();
2215
}
2216
2217
void MaterialStorage::shader_initialize(RID p_rid, bool p_embedded) {
2218
Shader shader;
2219
shader.data = nullptr;
2220
shader.mode = RS::SHADER_MAX;
2221
2222
shader_owner.initialize_rid(p_rid, shader);
2223
}
2224
2225
void MaterialStorage::shader_free(RID p_rid) {
2226
GLES3::Shader *shader = shader_owner.get_or_null(p_rid);
2227
ERR_FAIL_NULL(shader);
2228
2229
//make material unreference this
2230
while (shader->owners.size()) {
2231
material_set_shader((*shader->owners.begin())->self, RID());
2232
}
2233
2234
//clear data if exists
2235
if (shader->data) {
2236
memdelete(shader->data);
2237
}
2238
shader_owner.free(p_rid);
2239
}
2240
2241
void MaterialStorage::shader_set_code(RID p_shader, const String &p_code) {
2242
GLES3::Shader *shader = shader_owner.get_or_null(p_shader);
2243
ERR_FAIL_NULL(shader);
2244
2245
shader->code = p_code;
2246
2247
String mode_string = ShaderLanguage::get_shader_type(p_code);
2248
2249
RS::ShaderMode new_mode;
2250
if (mode_string == "canvas_item") {
2251
new_mode = RS::SHADER_CANVAS_ITEM;
2252
} else if (mode_string == "particles") {
2253
new_mode = RS::SHADER_PARTICLES;
2254
} else if (mode_string == "spatial") {
2255
new_mode = RS::SHADER_SPATIAL;
2256
} else if (mode_string == "sky") {
2257
new_mode = RS::SHADER_SKY;
2258
//} else if (mode_string == "fog") {
2259
// new_mode = RS::SHADER_FOG;
2260
} else if (mode_string == "texture_blit") {
2261
new_mode = RS::SHADER_TEXTURE_BLIT;
2262
} else {
2263
new_mode = RS::SHADER_MAX;
2264
ERR_PRINT("shader type " + mode_string + " not supported in OpenGL renderer");
2265
}
2266
2267
if (new_mode != shader->mode) {
2268
if (shader->data) {
2269
memdelete(shader->data);
2270
shader->data = nullptr;
2271
}
2272
2273
for (Material *E : shader->owners) {
2274
Material *material = E;
2275
material->shader_mode = new_mode;
2276
if (material->data) {
2277
memdelete(material->data);
2278
material->data = nullptr;
2279
}
2280
}
2281
2282
shader->mode = new_mode;
2283
2284
if (new_mode < RS::SHADER_MAX && shader_data_request_func[new_mode]) {
2285
shader->data = shader_data_request_func[new_mode]();
2286
} else {
2287
shader->mode = RS::SHADER_MAX; //invalid
2288
}
2289
2290
for (Material *E : shader->owners) {
2291
Material *material = E;
2292
if (shader->data) {
2293
material->data = material_data_request_func[new_mode](shader->data);
2294
material->data->self = material->self;
2295
material->data->set_next_pass(material->next_pass);
2296
material->data->set_render_priority(material->priority);
2297
}
2298
material->shader_mode = new_mode;
2299
}
2300
2301
if (shader->data) {
2302
for (const KeyValue<StringName, HashMap<int, RID>> &E : shader->default_texture_parameter) {
2303
for (const KeyValue<int, RID> &E2 : E.value) {
2304
shader->data->set_default_texture_parameter(E.key, E2.value, E2.key);
2305
}
2306
}
2307
}
2308
}
2309
2310
if (shader->data) {
2311
shader->data->set_path_hint(shader->path_hint);
2312
shader->data->set_code(p_code);
2313
}
2314
2315
for (Material *E : shader->owners) {
2316
Material *material = E;
2317
material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
2318
_material_queue_update(material, true, true);
2319
}
2320
}
2321
2322
void MaterialStorage::shader_set_path_hint(RID p_shader, const String &p_path) {
2323
GLES3::Shader *shader = shader_owner.get_or_null(p_shader);
2324
ERR_FAIL_NULL(shader);
2325
2326
shader->path_hint = p_path;
2327
if (shader->data) {
2328
shader->data->set_path_hint(p_path);
2329
}
2330
}
2331
2332
String MaterialStorage::shader_get_code(RID p_shader) const {
2333
const GLES3::Shader *shader = shader_owner.get_or_null(p_shader);
2334
ERR_FAIL_NULL_V(shader, String());
2335
return shader->code;
2336
}
2337
2338
void MaterialStorage::get_shader_parameter_list(RID p_shader, List<PropertyInfo> *p_param_list) const {
2339
GLES3::Shader *shader = shader_owner.get_or_null(p_shader);
2340
ERR_FAIL_NULL(shader);
2341
if (shader->data) {
2342
return shader->data->get_shader_uniform_list(p_param_list);
2343
}
2344
}
2345
2346
void MaterialStorage::shader_set_default_texture_parameter(RID p_shader, const StringName &p_name, RID p_texture, int p_index) {
2347
GLES3::Shader *shader = shader_owner.get_or_null(p_shader);
2348
ERR_FAIL_NULL(shader);
2349
2350
if (p_texture.is_valid() && TextureStorage::get_singleton()->owns_texture(p_texture)) {
2351
if (!shader->default_texture_parameter.has(p_name)) {
2352
shader->default_texture_parameter[p_name] = HashMap<int, RID>();
2353
}
2354
shader->default_texture_parameter[p_name][p_index] = p_texture;
2355
} else {
2356
if (shader->default_texture_parameter.has(p_name) && shader->default_texture_parameter[p_name].has(p_index)) {
2357
shader->default_texture_parameter[p_name].erase(p_index);
2358
2359
if (shader->default_texture_parameter[p_name].is_empty()) {
2360
shader->default_texture_parameter.erase(p_name);
2361
}
2362
}
2363
}
2364
if (shader->data) {
2365
shader->data->set_default_texture_parameter(p_name, p_texture, p_index);
2366
}
2367
for (Material *E : shader->owners) {
2368
Material *material = E;
2369
_material_queue_update(material, false, true);
2370
}
2371
}
2372
2373
RID MaterialStorage::shader_get_default_texture_parameter(RID p_shader, const StringName &p_name, int p_index) const {
2374
const GLES3::Shader *shader = shader_owner.get_or_null(p_shader);
2375
ERR_FAIL_NULL_V(shader, RID());
2376
if (shader->default_texture_parameter.has(p_name) && shader->default_texture_parameter[p_name].has(p_index)) {
2377
return shader->default_texture_parameter[p_name][p_index];
2378
}
2379
2380
return RID();
2381
}
2382
2383
Variant MaterialStorage::shader_get_parameter_default(RID p_shader, const StringName &p_param) const {
2384
Shader *shader = shader_owner.get_or_null(p_shader);
2385
ERR_FAIL_NULL_V(shader, Variant());
2386
if (shader->data) {
2387
return shader->data->get_default_parameter(p_param);
2388
}
2389
return Variant();
2390
}
2391
2392
RS::ShaderNativeSourceCode MaterialStorage::shader_get_native_source_code(RID p_shader) const {
2393
Shader *shader = shader_owner.get_or_null(p_shader);
2394
ERR_FAIL_NULL_V(shader, RS::ShaderNativeSourceCode());
2395
if (shader->data) {
2396
return shader->data->get_native_source_code();
2397
}
2398
return RS::ShaderNativeSourceCode();
2399
}
2400
2401
/* MATERIAL API */
2402
2403
void MaterialStorage::_material_queue_update(GLES3::Material *material, bool p_uniform, bool p_texture) {
2404
material->uniform_dirty = material->uniform_dirty || p_uniform;
2405
material->texture_dirty = material->texture_dirty || p_texture;
2406
2407
if (material->update_element.in_list()) {
2408
return;
2409
}
2410
2411
material_update_list.add(&material->update_element);
2412
}
2413
2414
void MaterialStorage::_update_queued_materials() {
2415
while (material_update_list.first()) {
2416
Material *material = material_update_list.first()->self();
2417
2418
if (material->data) {
2419
material->data->update_parameters(material->params, material->uniform_dirty, material->texture_dirty);
2420
}
2421
material->texture_dirty = false;
2422
material->uniform_dirty = false;
2423
2424
material_update_list.remove(&material->update_element);
2425
}
2426
}
2427
2428
RID MaterialStorage::material_allocate() {
2429
return material_owner.allocate_rid();
2430
}
2431
2432
void MaterialStorage::material_initialize(RID p_rid) {
2433
material_owner.initialize_rid(p_rid);
2434
Material *material = material_owner.get_or_null(p_rid);
2435
material->self = p_rid;
2436
}
2437
2438
void MaterialStorage::material_free(RID p_rid) {
2439
Material *material = material_owner.get_or_null(p_rid);
2440
ERR_FAIL_NULL(material);
2441
2442
// Need to clear texture arrays to prevent spin locking of their RID's.
2443
// This happens when the app is being closed.
2444
for (KeyValue<StringName, Variant> &E : material->params) {
2445
if (E.value.get_type() == Variant::ARRAY) {
2446
// Clear the array for this material only (the array may be shared).
2447
E.value = Variant();
2448
}
2449
}
2450
2451
material_set_shader(p_rid, RID()); //clean up shader
2452
material->dependency.deleted_notify(p_rid);
2453
2454
material_owner.free(p_rid);
2455
}
2456
2457
void MaterialStorage::material_set_shader(RID p_material, RID p_shader) {
2458
GLES3::Material *material = material_owner.get_or_null(p_material);
2459
ERR_FAIL_NULL(material);
2460
2461
if (material->data) {
2462
memdelete(material->data);
2463
material->data = nullptr;
2464
}
2465
2466
if (material->shader) {
2467
material->shader->owners.erase(material);
2468
material->shader = nullptr;
2469
material->shader_mode = RS::SHADER_MAX;
2470
}
2471
2472
if (p_shader.is_null()) {
2473
material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
2474
material->shader_id = 0;
2475
return;
2476
}
2477
2478
Shader *shader = get_shader(p_shader);
2479
ERR_FAIL_NULL(shader);
2480
material->shader = shader;
2481
material->shader_mode = shader->mode;
2482
material->shader_id = p_shader.get_local_index();
2483
shader->owners.insert(material);
2484
2485
if (shader->mode == RS::SHADER_MAX) {
2486
return;
2487
}
2488
2489
ERR_FAIL_NULL(shader->data);
2490
2491
material->data = material_data_request_func[shader->mode](shader->data);
2492
material->data->self = p_material;
2493
material->data->set_next_pass(material->next_pass);
2494
material->data->set_render_priority(material->priority);
2495
//updating happens later
2496
material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
2497
_material_queue_update(material, true, true);
2498
}
2499
2500
void MaterialStorage::material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) {
2501
GLES3::Material *material = material_owner.get_or_null(p_material);
2502
ERR_FAIL_NULL(material);
2503
2504
if (p_value.get_type() == Variant::NIL) {
2505
material->params.erase(p_param);
2506
} else {
2507
ERR_FAIL_COND(p_value.get_type() == Variant::OBJECT); //object not allowed
2508
material->params[p_param] = p_value;
2509
}
2510
2511
if (material->shader && material->shader->data) { //shader is valid
2512
bool is_texture = material->shader->data->is_parameter_texture(p_param);
2513
_material_queue_update(material, !is_texture, is_texture);
2514
} else {
2515
_material_queue_update(material, true, true);
2516
}
2517
}
2518
2519
Variant MaterialStorage::material_get_param(RID p_material, const StringName &p_param) const {
2520
const GLES3::Material *material = material_owner.get_or_null(p_material);
2521
ERR_FAIL_NULL_V(material, Variant());
2522
if (material->params.has(p_param)) {
2523
return material->params[p_param];
2524
} else {
2525
return Variant();
2526
}
2527
}
2528
2529
void MaterialStorage::material_set_next_pass(RID p_material, RID p_next_material) {
2530
GLES3::Material *material = material_owner.get_or_null(p_material);
2531
ERR_FAIL_NULL(material);
2532
2533
if (material->next_pass == p_next_material) {
2534
return;
2535
}
2536
2537
material->next_pass = p_next_material;
2538
if (material->data) {
2539
material->data->set_next_pass(p_next_material);
2540
}
2541
2542
material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
2543
}
2544
2545
void MaterialStorage::material_set_render_priority(RID p_material, int priority) {
2546
ERR_FAIL_COND(priority < RS::MATERIAL_RENDER_PRIORITY_MIN);
2547
ERR_FAIL_COND(priority > RS::MATERIAL_RENDER_PRIORITY_MAX);
2548
2549
GLES3::Material *material = material_owner.get_or_null(p_material);
2550
ERR_FAIL_NULL(material);
2551
material->priority = priority;
2552
if (material->data) {
2553
material->data->set_render_priority(priority);
2554
}
2555
material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);
2556
}
2557
2558
bool MaterialStorage::material_is_animated(RID p_material) {
2559
GLES3::Material *material = material_owner.get_or_null(p_material);
2560
ERR_FAIL_NULL_V(material, false);
2561
if (material->shader && material->shader->data) {
2562
if (material->shader->data->is_animated()) {
2563
return true;
2564
} else if (material->next_pass.is_valid()) {
2565
return material_is_animated(material->next_pass);
2566
}
2567
}
2568
return false; //by default nothing is animated
2569
}
2570
2571
bool MaterialStorage::material_casts_shadows(RID p_material) {
2572
GLES3::Material *material = material_owner.get_or_null(p_material);
2573
ERR_FAIL_NULL_V(material, true);
2574
if (material->shader && material->shader->data) {
2575
if (material->shader->data->casts_shadows()) {
2576
return true;
2577
} else if (material->next_pass.is_valid()) {
2578
return material_casts_shadows(material->next_pass);
2579
}
2580
}
2581
return true; //by default everything casts shadows
2582
}
2583
2584
RS::CullMode MaterialStorage::material_get_cull_mode(RID p_material) const {
2585
const GLES3::Material *material = material_owner.get_or_null(p_material);
2586
ERR_FAIL_NULL_V(material, RS::CULL_MODE_DISABLED);
2587
ERR_FAIL_NULL_V(material->shader, RS::CULL_MODE_DISABLED);
2588
if (material->shader->data) {
2589
SceneShaderData *data = dynamic_cast<SceneShaderData *>(material->shader->data);
2590
if (data) {
2591
return (RS::CullMode)data->cull_mode;
2592
}
2593
}
2594
return RS::CULL_MODE_DISABLED;
2595
}
2596
2597
void MaterialStorage::material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) {
2598
GLES3::Material *material = material_owner.get_or_null(p_material);
2599
ERR_FAIL_NULL(material);
2600
if (material->shader && material->shader->data) {
2601
material->shader->data->get_instance_param_list(r_parameters);
2602
2603
if (material->next_pass.is_valid()) {
2604
material_get_instance_shader_parameters(material->next_pass, r_parameters);
2605
}
2606
}
2607
}
2608
2609
void MaterialStorage::material_update_dependency(RID p_material, DependencyTracker *p_instance) {
2610
Material *material = material_owner.get_or_null(p_material);
2611
ERR_FAIL_NULL(material);
2612
p_instance->update_dependency(&material->dependency);
2613
if (material->next_pass.is_valid()) {
2614
material_update_dependency(material->next_pass, p_instance);
2615
}
2616
}
2617
2618
LocalVector<ShaderGLES3::TextureUniformData> get_texture_uniform_data(const Vector<ShaderCompiler::GeneratedCode::Texture> &texture_uniforms) {
2619
LocalVector<ShaderGLES3::TextureUniformData> texture_uniform_data;
2620
for (int i = 0; i < texture_uniforms.size(); i++) {
2621
int num_textures = texture_uniforms[i].array_size;
2622
if (num_textures == 0) {
2623
num_textures = 1;
2624
}
2625
texture_uniform_data.push_back({ texture_uniforms[i].name, num_textures });
2626
}
2627
return texture_uniform_data;
2628
}
2629
2630
/* Canvas Shader Data */
2631
2632
void CanvasShaderData::set_code(const String &p_code) {
2633
// Initialize and compile the shader.
2634
2635
code = p_code;
2636
valid = false;
2637
ubo_size = 0;
2638
uniforms.clear();
2639
2640
uses_screen_texture = false;
2641
uses_screen_texture_mipmaps = false;
2642
uses_sdf = false;
2643
uses_time = false;
2644
uses_custom0 = false;
2645
uses_custom1 = false;
2646
2647
if (code.is_empty()) {
2648
return; // Just invalid, but no error.
2649
}
2650
2651
ShaderCompiler::GeneratedCode gen_code;
2652
2653
// Actual enum set further down after compilation.
2654
int blend_modei = BLEND_MODE_MIX;
2655
2656
ShaderCompiler::IdentifierActions actions;
2657
actions.entry_point_stages["vertex"] = ShaderCompiler::STAGE_VERTEX;
2658
actions.entry_point_stages["fragment"] = ShaderCompiler::STAGE_FRAGMENT;
2659
actions.entry_point_stages["light"] = ShaderCompiler::STAGE_FRAGMENT;
2660
2661
actions.render_mode_values["blend_add"] = Pair<int *, int>(&blend_modei, BLEND_MODE_ADD);
2662
actions.render_mode_values["blend_mix"] = Pair<int *, int>(&blend_modei, BLEND_MODE_MIX);
2663
actions.render_mode_values["blend_sub"] = Pair<int *, int>(&blend_modei, BLEND_MODE_SUB);
2664
actions.render_mode_values["blend_mul"] = Pair<int *, int>(&blend_modei, BLEND_MODE_MUL);
2665
actions.render_mode_values["blend_premul_alpha"] = Pair<int *, int>(&blend_modei, BLEND_MODE_PMALPHA);
2666
actions.render_mode_values["blend_disabled"] = Pair<int *, int>(&blend_modei, BLEND_MODE_DISABLED);
2667
2668
actions.usage_flag_pointers["texture_sdf"] = &uses_sdf;
2669
actions.usage_flag_pointers["TIME"] = &uses_time;
2670
actions.usage_flag_pointers["CUSTOM0"] = &uses_custom0;
2671
actions.usage_flag_pointers["CUSTOM1"] = &uses_custom1;
2672
2673
actions.uniforms = &uniforms;
2674
Error err = MaterialStorage::get_singleton()->shaders.compiler_canvas.compile(RS::SHADER_CANVAS_ITEM, code, &actions, path, gen_code);
2675
ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed.");
2676
2677
if (version.is_null()) {
2678
version = MaterialStorage::get_singleton()->shaders.canvas_shader.version_create();
2679
}
2680
2681
blend_mode = BlendMode(blend_modei);
2682
uses_screen_texture = gen_code.uses_screen_texture;
2683
uses_screen_texture_mipmaps = gen_code.uses_screen_texture_mipmaps;
2684
2685
#if 0
2686
print_line("**compiling shader:");
2687
print_line("**defines:\n");
2688
for (int i = 0; i < gen_code.defines.size(); i++) {
2689
print_line(gen_code.defines[i]);
2690
}
2691
2692
HashMap<String, String>::Iterator el = gen_code.code.begin();
2693
while (el) {
2694
print_line("\n**code " + el->key + ":\n" + el->value);
2695
++el;
2696
}
2697
2698
print_line("\n**uniforms:\n" + gen_code.uniforms);
2699
print_line("\n**vertex_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX]);
2700
print_line("\n**fragment_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT]);
2701
#endif
2702
2703
LocalVector<ShaderGLES3::TextureUniformData> texture_uniform_data = get_texture_uniform_data(gen_code.texture_uniforms);
2704
2705
MaterialStorage::get_singleton()->shaders.canvas_shader.version_set_code(version, gen_code.code, gen_code.uniforms, gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX], gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT], gen_code.defines, texture_uniform_data);
2706
ERR_FAIL_COND(!MaterialStorage::get_singleton()->shaders.canvas_shader.version_is_valid(version));
2707
2708
vertex_input_mask = RS::ARRAY_FORMAT_VERTEX | RS::ARRAY_FORMAT_COLOR | RS::ARRAY_FORMAT_TEX_UV;
2709
vertex_input_mask |= uses_custom0 << RS::ARRAY_CUSTOM0;
2710
vertex_input_mask |= uses_custom1 << RS::ARRAY_CUSTOM1;
2711
2712
ubo_size = gen_code.uniform_total_size;
2713
ubo_offsets = gen_code.uniform_offsets;
2714
texture_uniforms = gen_code.texture_uniforms;
2715
2716
valid = true;
2717
}
2718
2719
bool CanvasShaderData::is_animated() const {
2720
return false;
2721
}
2722
2723
bool CanvasShaderData::casts_shadows() const {
2724
return false;
2725
}
2726
2727
RS::ShaderNativeSourceCode CanvasShaderData::get_native_source_code() const {
2728
return MaterialStorage::get_singleton()->shaders.canvas_shader.version_get_native_source_code(version);
2729
}
2730
2731
CanvasShaderData::CanvasShaderData() {
2732
valid = false;
2733
uses_screen_texture = false;
2734
uses_sdf = false;
2735
}
2736
2737
CanvasShaderData::~CanvasShaderData() {
2738
if (version.is_valid()) {
2739
MaterialStorage::get_singleton()->shaders.canvas_shader.version_free(version);
2740
}
2741
}
2742
2743
GLES3::ShaderData *GLES3::_create_canvas_shader_func() {
2744
CanvasShaderData *shader_data = memnew(CanvasShaderData);
2745
return shader_data;
2746
}
2747
2748
void CanvasMaterialData::update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
2749
update_parameters_internal(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, false);
2750
}
2751
2752
static void bind_uniforms_generic(const Vector<RID> &p_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, int texture_offset = 0, const RS::CanvasItemTextureFilter *filter_mapping = filter_from_uniform, const RS::CanvasItemTextureRepeat *repeat_mapping = repeat_from_uniform) {
2753
const RID *textures = p_textures.ptr();
2754
const ShaderCompiler::GeneratedCode::Texture *texture_uniforms = p_texture_uniforms.ptr();
2755
int texture_uniform_index = 0;
2756
int texture_uniform_count = 0;
2757
for (int ti = 0; ti < p_textures.size(); ti++) {
2758
ERR_FAIL_COND_MSG(texture_uniform_index >= p_texture_uniforms.size(), "texture_uniform_index out of bounds");
2759
GLES3::Texture *texture = TextureStorage::get_singleton()->get_texture(textures[ti]);
2760
const ShaderCompiler::GeneratedCode::Texture &texture_uniform = texture_uniforms[texture_uniform_index];
2761
if (texture) {
2762
glActiveTexture(GL_TEXTURE0 + texture_offset + ti);
2763
GLenum target = target_from_type[texture_uniform.type];
2764
if (target == _GL_TEXTURE_EXTERNAL_OES && !GLES3::Config::get_singleton()->external_texture_supported) {
2765
target = GL_TEXTURE_2D;
2766
}
2767
glBindTexture(target, texture->tex_id);
2768
if (texture->render_target) {
2769
texture->render_target->used_in_frame = true;
2770
}
2771
2772
texture->gl_set_filter(filter_mapping[int(texture_uniform.filter)]);
2773
texture->gl_set_repeat(repeat_mapping[int(texture_uniform.repeat)]);
2774
}
2775
texture_uniform_count++;
2776
if (texture_uniform_count >= texture_uniform.array_size) {
2777
texture_uniform_index++;
2778
texture_uniform_count = 0;
2779
}
2780
}
2781
}
2782
2783
void CanvasMaterialData::bind_uniforms() {
2784
// Bind Material Uniforms
2785
glBindBufferBase(GL_UNIFORM_BUFFER, RasterizerCanvasGLES3::MATERIAL_UNIFORM_LOCATION, uniform_buffer);
2786
2787
bind_uniforms_generic(texture_cache, shader_data->texture_uniforms, 1, filter_from_uniform_canvas, repeat_from_uniform_canvas); // Start at GL_TEXTURE1 because texture slot 0 is used by the base texture
2788
}
2789
2790
CanvasMaterialData::~CanvasMaterialData() {
2791
}
2792
2793
GLES3::MaterialData *GLES3::_create_canvas_material_func(ShaderData *p_shader) {
2794
CanvasMaterialData *material_data = memnew(CanvasMaterialData);
2795
material_data->shader_data = static_cast<CanvasShaderData *>(p_shader);
2796
//update will happen later anyway so do nothing.
2797
return material_data;
2798
}
2799
2800
////////////////////////////////////////////////////////////////////////////////
2801
// SKY SHADER
2802
2803
void SkyShaderData::set_code(const String &p_code) {
2804
// Initialize and compile the shader.
2805
2806
code = p_code;
2807
valid = false;
2808
ubo_size = 0;
2809
uniforms.clear();
2810
2811
uses_time = false;
2812
uses_position = false;
2813
uses_half_res = false;
2814
uses_quarter_res = false;
2815
uses_light = false;
2816
2817
if (code.is_empty()) {
2818
return; // Just invalid, but no error.
2819
}
2820
2821
ShaderCompiler::GeneratedCode gen_code;
2822
2823
ShaderCompiler::IdentifierActions actions;
2824
actions.entry_point_stages["sky"] = ShaderCompiler::STAGE_FRAGMENT;
2825
2826
actions.render_mode_flags["use_half_res_pass"] = &uses_half_res;
2827
actions.render_mode_flags["use_quarter_res_pass"] = &uses_quarter_res;
2828
2829
actions.usage_flag_pointers["TIME"] = &uses_time;
2830
actions.usage_flag_pointers["POSITION"] = &uses_position;
2831
actions.usage_flag_pointers["LIGHT0_ENABLED"] = &uses_light;
2832
actions.usage_flag_pointers["LIGHT0_ENERGY"] = &uses_light;
2833
actions.usage_flag_pointers["LIGHT0_DIRECTION"] = &uses_light;
2834
actions.usage_flag_pointers["LIGHT0_COLOR"] = &uses_light;
2835
actions.usage_flag_pointers["LIGHT0_SIZE"] = &uses_light;
2836
actions.usage_flag_pointers["LIGHT1_ENABLED"] = &uses_light;
2837
actions.usage_flag_pointers["LIGHT1_ENERGY"] = &uses_light;
2838
actions.usage_flag_pointers["LIGHT1_DIRECTION"] = &uses_light;
2839
actions.usage_flag_pointers["LIGHT1_COLOR"] = &uses_light;
2840
actions.usage_flag_pointers["LIGHT1_SIZE"] = &uses_light;
2841
actions.usage_flag_pointers["LIGHT2_ENABLED"] = &uses_light;
2842
actions.usage_flag_pointers["LIGHT2_ENERGY"] = &uses_light;
2843
actions.usage_flag_pointers["LIGHT2_DIRECTION"] = &uses_light;
2844
actions.usage_flag_pointers["LIGHT2_COLOR"] = &uses_light;
2845
actions.usage_flag_pointers["LIGHT2_SIZE"] = &uses_light;
2846
actions.usage_flag_pointers["LIGHT3_ENABLED"] = &uses_light;
2847
actions.usage_flag_pointers["LIGHT3_ENERGY"] = &uses_light;
2848
actions.usage_flag_pointers["LIGHT3_DIRECTION"] = &uses_light;
2849
actions.usage_flag_pointers["LIGHT3_COLOR"] = &uses_light;
2850
actions.usage_flag_pointers["LIGHT3_SIZE"] = &uses_light;
2851
2852
actions.uniforms = &uniforms;
2853
2854
Error err = MaterialStorage::get_singleton()->shaders.compiler_sky.compile(RS::SHADER_SKY, code, &actions, path, gen_code);
2855
ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed.");
2856
2857
if (version.is_null()) {
2858
version = MaterialStorage::get_singleton()->shaders.sky_shader.version_create();
2859
}
2860
2861
#if 0
2862
print_line("**compiling shader:");
2863
print_line("**defines:\n");
2864
for (int i = 0; i < gen_code.defines.size(); i++) {
2865
print_line(gen_code.defines[i]);
2866
}
2867
2868
HashMap<String, String>::Iterator el = gen_code.code.begin();
2869
while (el) {
2870
print_line("\n**code " + el->key + ":\n" + el->value);
2871
++el;
2872
}
2873
2874
print_line("\n**uniforms:\n" + gen_code.uniforms);
2875
print_line("\n**vertex_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX]);
2876
print_line("\n**fragment_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT]);
2877
#endif
2878
2879
LocalVector<ShaderGLES3::TextureUniformData> texture_uniform_data = get_texture_uniform_data(gen_code.texture_uniforms);
2880
2881
MaterialStorage::get_singleton()->shaders.sky_shader.version_set_code(version, gen_code.code, gen_code.uniforms, gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX], gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT], gen_code.defines, texture_uniform_data);
2882
ERR_FAIL_COND(!MaterialStorage::get_singleton()->shaders.sky_shader.version_is_valid(version));
2883
2884
ubo_size = gen_code.uniform_total_size;
2885
ubo_offsets = gen_code.uniform_offsets;
2886
texture_uniforms = gen_code.texture_uniforms;
2887
2888
valid = true;
2889
}
2890
2891
bool SkyShaderData::is_animated() const {
2892
return false;
2893
}
2894
2895
bool SkyShaderData::casts_shadows() const {
2896
return false;
2897
}
2898
2899
RS::ShaderNativeSourceCode SkyShaderData::get_native_source_code() const {
2900
return MaterialStorage::get_singleton()->shaders.sky_shader.version_get_native_source_code(version);
2901
}
2902
2903
SkyShaderData::SkyShaderData() {
2904
valid = false;
2905
}
2906
2907
SkyShaderData::~SkyShaderData() {
2908
if (version.is_valid()) {
2909
MaterialStorage::get_singleton()->shaders.sky_shader.version_free(version);
2910
}
2911
}
2912
2913
GLES3::ShaderData *GLES3::_create_sky_shader_func() {
2914
SkyShaderData *shader_data = memnew(SkyShaderData);
2915
return shader_data;
2916
}
2917
2918
////////////////////////////////////////////////////////////////////////////////
2919
// Sky material
2920
2921
void SkyMaterialData::update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
2922
uniform_set_updated = true;
2923
update_parameters_internal(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, true);
2924
}
2925
2926
SkyMaterialData::~SkyMaterialData() {
2927
}
2928
GLES3::MaterialData *GLES3::_create_sky_material_func(ShaderData *p_shader) {
2929
SkyMaterialData *material_data = memnew(SkyMaterialData);
2930
material_data->shader_data = static_cast<SkyShaderData *>(p_shader);
2931
//update will happen later anyway so do nothing.
2932
return material_data;
2933
}
2934
2935
void SkyMaterialData::bind_uniforms() {
2936
// Bind Material Uniforms
2937
glBindBufferBase(GL_UNIFORM_BUFFER, SKY_MATERIAL_UNIFORM_LOCATION, uniform_buffer);
2938
2939
bind_uniforms_generic(texture_cache, shader_data->texture_uniforms);
2940
}
2941
2942
////////////////////////////////////////////////////////////////////////////////
2943
// Scene SHADER
2944
2945
void SceneShaderData::set_code(const String &p_code) {
2946
// Initialize and compile the shader.
2947
2948
code = p_code;
2949
valid = false;
2950
ubo_size = 0;
2951
uniforms.clear();
2952
2953
uses_point_size = false;
2954
uses_alpha = false;
2955
uses_alpha_clip = false;
2956
uses_blend_alpha = false;
2957
uses_depth_prepass_alpha = false;
2958
uses_discard = false;
2959
uses_roughness = false;
2960
uses_normal = false;
2961
uses_particle_trails = false;
2962
wireframe = false;
2963
2964
unshaded = false;
2965
uses_vertex = false;
2966
uses_position = false;
2967
uses_sss = false;
2968
uses_transmittance = false;
2969
uses_screen_texture = false;
2970
uses_screen_texture_mipmaps = false;
2971
uses_depth_texture = false;
2972
uses_normal_texture = false;
2973
uses_bent_normal_texture = false;
2974
uses_time = false;
2975
uses_vertex_time = false;
2976
uses_fragment_time = false;
2977
writes_modelview_or_projection = false;
2978
uses_world_coordinates = false;
2979
uses_tangent = false;
2980
uses_color = false;
2981
uses_uv = false;
2982
uses_uv2 = false;
2983
uses_custom0 = false;
2984
uses_custom1 = false;
2985
uses_custom2 = false;
2986
uses_custom3 = false;
2987
uses_bones = false;
2988
uses_weights = false;
2989
2990
if (code.is_empty()) {
2991
return; // Just invalid, but no error.
2992
}
2993
2994
ShaderCompiler::GeneratedCode gen_code;
2995
2996
// Actual enums set further down after compilation.
2997
int blend_modei = BLEND_MODE_MIX;
2998
int depth_test_disabledi = 0;
2999
int depth_test_invertedi = 0;
3000
int alpha_antialiasing_modei = ALPHA_ANTIALIASING_OFF;
3001
int cull_modei = RS::CULL_MODE_BACK;
3002
int depth_drawi = DEPTH_DRAW_OPAQUE;
3003
3004
int stencil_readi = 0;
3005
int stencil_writei = 0;
3006
int stencil_write_depth_faili = 0;
3007
int stencil_comparei = STENCIL_COMPARE_ALWAYS;
3008
int stencil_referencei = -1;
3009
3010
ShaderCompiler::IdentifierActions actions;
3011
actions.entry_point_stages["vertex"] = ShaderCompiler::STAGE_VERTEX;
3012
actions.entry_point_stages["fragment"] = ShaderCompiler::STAGE_FRAGMENT;
3013
actions.entry_point_stages["light"] = ShaderCompiler::STAGE_FRAGMENT;
3014
3015
actions.render_mode_values["blend_add"] = Pair<int *, int>(&blend_modei, BLEND_MODE_ADD);
3016
actions.render_mode_values["blend_mix"] = Pair<int *, int>(&blend_modei, BLEND_MODE_MIX);
3017
actions.render_mode_values["blend_sub"] = Pair<int *, int>(&blend_modei, BLEND_MODE_SUB);
3018
actions.render_mode_values["blend_mul"] = Pair<int *, int>(&blend_modei, BLEND_MODE_MUL);
3019
actions.render_mode_values["blend_premul_alpha"] = Pair<int *, int>(&blend_modei, BLEND_MODE_PREMULT_ALPHA);
3020
3021
actions.render_mode_values["alpha_to_coverage"] = Pair<int *, int>(&alpha_antialiasing_modei, ALPHA_ANTIALIASING_ALPHA_TO_COVERAGE);
3022
actions.render_mode_values["alpha_to_coverage_and_one"] = Pair<int *, int>(&alpha_antialiasing_modei, ALPHA_ANTIALIASING_ALPHA_TO_COVERAGE_AND_TO_ONE);
3023
3024
actions.render_mode_values["depth_draw_never"] = Pair<int *, int>(&depth_drawi, DEPTH_DRAW_DISABLED);
3025
actions.render_mode_values["depth_draw_opaque"] = Pair<int *, int>(&depth_drawi, DEPTH_DRAW_OPAQUE);
3026
actions.render_mode_values["depth_draw_always"] = Pair<int *, int>(&depth_drawi, DEPTH_DRAW_ALWAYS);
3027
3028
actions.render_mode_values["depth_test_disabled"] = Pair<int *, int>(&depth_test_disabledi, 1);
3029
actions.render_mode_values["depth_test_inverted"] = Pair<int *, int>(&depth_test_invertedi, 1);
3030
3031
actions.render_mode_values["cull_disabled"] = Pair<int *, int>(&cull_modei, RS::CULL_MODE_DISABLED);
3032
actions.render_mode_values["cull_front"] = Pair<int *, int>(&cull_modei, RS::CULL_MODE_FRONT);
3033
actions.render_mode_values["cull_back"] = Pair<int *, int>(&cull_modei, RS::CULL_MODE_BACK);
3034
3035
actions.render_mode_flags["unshaded"] = &unshaded;
3036
actions.render_mode_flags["wireframe"] = &wireframe;
3037
actions.render_mode_flags["particle_trails"] = &uses_particle_trails;
3038
actions.render_mode_flags["world_vertex_coords"] = &uses_world_coordinates;
3039
3040
actions.usage_flag_pointers["ALPHA"] = &uses_alpha;
3041
actions.usage_flag_pointers["ALPHA_SCISSOR_THRESHOLD"] = &uses_alpha_clip;
3042
// Use alpha clip pipeline for alpha hash/dither.
3043
// This prevents sorting issues inherent to alpha blending and allows such materials to cast shadows.
3044
actions.usage_flag_pointers["ALPHA_HASH_SCALE"] = &uses_alpha_clip;
3045
actions.render_mode_flags["depth_prepass_alpha"] = &uses_depth_prepass_alpha;
3046
3047
actions.usage_flag_pointers["SSS_STRENGTH"] = &uses_sss;
3048
actions.usage_flag_pointers["SSS_TRANSMITTANCE_DEPTH"] = &uses_transmittance;
3049
3050
actions.usage_flag_pointers["DISCARD"] = &uses_discard;
3051
actions.usage_flag_pointers["TIME"] = &uses_time;
3052
actions.usage_flag_pointers["ROUGHNESS"] = &uses_roughness;
3053
actions.usage_flag_pointers["NORMAL"] = &uses_normal;
3054
actions.usage_flag_pointers["NORMAL_MAP"] = &uses_normal;
3055
actions.usage_flag_pointers["BENT_NORMAL_MAP"] = &uses_bent_normal_texture;
3056
3057
actions.usage_flag_pointers["POINT_SIZE"] = &uses_point_size;
3058
actions.usage_flag_pointers["POINT_COORD"] = &uses_point_size;
3059
3060
actions.write_flag_pointers["MODELVIEW_MATRIX"] = &writes_modelview_or_projection;
3061
actions.write_flag_pointers["PROJECTION_MATRIX"] = &writes_modelview_or_projection;
3062
actions.write_flag_pointers["VERTEX"] = &uses_vertex;
3063
actions.write_flag_pointers["POSITION"] = &uses_position;
3064
3065
actions.usage_flag_pointers["TANGENT"] = &uses_tangent;
3066
actions.usage_flag_pointers["BINORMAL"] = &uses_tangent;
3067
actions.usage_flag_pointers["ANISOTROPY"] = &uses_tangent;
3068
actions.usage_flag_pointers["ANISOTROPY_FLOW"] = &uses_tangent;
3069
actions.usage_flag_pointers["COLOR"] = &uses_color;
3070
actions.usage_flag_pointers["UV"] = &uses_uv;
3071
actions.usage_flag_pointers["UV2"] = &uses_uv2;
3072
actions.usage_flag_pointers["CUSTOM0"] = &uses_custom0;
3073
actions.usage_flag_pointers["CUSTOM1"] = &uses_custom1;
3074
actions.usage_flag_pointers["CUSTOM2"] = &uses_custom2;
3075
actions.usage_flag_pointers["CUSTOM3"] = &uses_custom3;
3076
actions.usage_flag_pointers["BONE_INDICES"] = &uses_bones;
3077
actions.usage_flag_pointers["BONE_WEIGHTS"] = &uses_weights;
3078
3079
actions.stencil_mode_values["read"] = Pair<int *, int>(&stencil_readi, STENCIL_FLAG_READ);
3080
actions.stencil_mode_values["write"] = Pair<int *, int>(&stencil_writei, STENCIL_FLAG_WRITE);
3081
actions.stencil_mode_values["write_depth_fail"] = Pair<int *, int>(&stencil_write_depth_faili, STENCIL_FLAG_WRITE_DEPTH_FAIL);
3082
3083
actions.stencil_mode_values["compare_less"] = Pair<int *, int>(&stencil_comparei, STENCIL_COMPARE_LESS);
3084
actions.stencil_mode_values["compare_equal"] = Pair<int *, int>(&stencil_comparei, STENCIL_COMPARE_EQUAL);
3085
actions.stencil_mode_values["compare_less_or_equal"] = Pair<int *, int>(&stencil_comparei, STENCIL_COMPARE_LESS_OR_EQUAL);
3086
actions.stencil_mode_values["compare_greater"] = Pair<int *, int>(&stencil_comparei, STENCIL_COMPARE_GREATER);
3087
actions.stencil_mode_values["compare_not_equal"] = Pair<int *, int>(&stencil_comparei, STENCIL_COMPARE_NOT_EQUAL);
3088
actions.stencil_mode_values["compare_greater_or_equal"] = Pair<int *, int>(&stencil_comparei, STENCIL_COMPARE_GREATER_OR_EQUAL);
3089
actions.stencil_mode_values["compare_always"] = Pair<int *, int>(&stencil_comparei, STENCIL_COMPARE_ALWAYS);
3090
3091
actions.stencil_reference = &stencil_referencei;
3092
3093
actions.uniforms = &uniforms;
3094
3095
Error err = MaterialStorage::get_singleton()->shaders.compiler_scene.compile(RS::SHADER_SPATIAL, code, &actions, path, gen_code);
3096
ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed.");
3097
3098
if (version.is_null()) {
3099
version = MaterialStorage::get_singleton()->shaders.scene_shader.version_create();
3100
}
3101
3102
blend_mode = BlendMode(blend_modei);
3103
alpha_antialiasing_mode = AlphaAntiAliasing(alpha_antialiasing_modei);
3104
depth_draw = DepthDraw(depth_drawi);
3105
if (depth_test_disabledi) {
3106
depth_test = DEPTH_TEST_DISABLED;
3107
} else if (depth_test_invertedi) {
3108
depth_test = DEPTH_TEST_ENABLED_INVERTED;
3109
} else {
3110
depth_test = DEPTH_TEST_ENABLED;
3111
}
3112
cull_mode = RS::CullMode(cull_modei);
3113
3114
vertex_input_mask = RS::ARRAY_FORMAT_VERTEX | RS::ARRAY_FORMAT_NORMAL; // We can always read vertices and normals.
3115
vertex_input_mask |= uses_tangent << RS::ARRAY_TANGENT;
3116
vertex_input_mask |= uses_color << RS::ARRAY_COLOR;
3117
vertex_input_mask |= uses_uv << RS::ARRAY_TEX_UV;
3118
vertex_input_mask |= uses_uv2 << RS::ARRAY_TEX_UV2;
3119
vertex_input_mask |= uses_custom0 << RS::ARRAY_CUSTOM0;
3120
vertex_input_mask |= uses_custom1 << RS::ARRAY_CUSTOM1;
3121
vertex_input_mask |= uses_custom2 << RS::ARRAY_CUSTOM2;
3122
vertex_input_mask |= uses_custom3 << RS::ARRAY_CUSTOM3;
3123
vertex_input_mask |= uses_bones << RS::ARRAY_BONES;
3124
vertex_input_mask |= uses_weights << RS::ARRAY_WEIGHTS;
3125
3126
uses_screen_texture = gen_code.uses_screen_texture;
3127
uses_screen_texture_mipmaps = gen_code.uses_screen_texture_mipmaps;
3128
uses_depth_texture = gen_code.uses_depth_texture;
3129
uses_normal_texture = gen_code.uses_normal_roughness_texture;
3130
uses_vertex_time = gen_code.uses_vertex_time;
3131
uses_fragment_time = gen_code.uses_fragment_time;
3132
3133
stencil_enabled = stencil_referencei != -1;
3134
stencil_flags = stencil_readi | stencil_writei | stencil_write_depth_faili;
3135
stencil_compare = StencilCompare(stencil_comparei);
3136
stencil_reference = stencil_referencei;
3137
3138
#ifdef DEBUG_ENABLED
3139
if (uses_particle_trails) {
3140
WARN_PRINT_ONCE_ED("Particle trails are only available when using the Forward+ or Mobile renderer.");
3141
}
3142
3143
if (uses_sss) {
3144
WARN_PRINT_ONCE_ED("Subsurface scattering is only available when using the Forward+ renderer.");
3145
}
3146
3147
if (uses_transmittance) {
3148
WARN_PRINT_ONCE_ED("Transmittance is only available when using the Forward+ renderer.");
3149
}
3150
3151
if (uses_normal_texture) {
3152
WARN_PRINT_ONCE_ED("Reading from the normal-roughness texture is only available when using the Forward+ or Mobile renderer.");
3153
}
3154
#endif
3155
3156
#if 0
3157
print_line("**compiling shader:");
3158
print_line("**defines:\n");
3159
for (int i = 0; i < gen_code.defines.size(); i++) {
3160
print_line(gen_code.defines[i]);
3161
}
3162
3163
HashMap<String, String>::Iterator el = gen_code.code.begin();
3164
while (el) {
3165
print_line("\n**code " + el->key + ":\n" + el->value);
3166
++el;
3167
}
3168
3169
print_line("\n**uniforms:\n" + gen_code.uniforms);
3170
print_line("\n**vertex_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX]);
3171
print_line("\n**fragment_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT]);
3172
#endif
3173
3174
LocalVector<ShaderGLES3::TextureUniformData> texture_uniform_data = get_texture_uniform_data(gen_code.texture_uniforms);
3175
3176
MaterialStorage::get_singleton()->shaders.scene_shader.version_set_code(version, gen_code.code, gen_code.uniforms, gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX], gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT], gen_code.defines, texture_uniform_data);
3177
ERR_FAIL_COND(!MaterialStorage::get_singleton()->shaders.scene_shader.version_is_valid(version));
3178
3179
ubo_size = gen_code.uniform_total_size;
3180
ubo_offsets = gen_code.uniform_offsets;
3181
texture_uniforms = gen_code.texture_uniforms;
3182
3183
// If any form of Alpha Antialiasing is enabled, set the blend mode to alpha to coverage.
3184
if (alpha_antialiasing_mode != ALPHA_ANTIALIASING_OFF) {
3185
blend_mode = BLEND_MODE_ALPHA_TO_COVERAGE;
3186
}
3187
3188
if (blend_mode == BLEND_MODE_ADD || blend_mode == BLEND_MODE_SUB || blend_mode == BLEND_MODE_MUL) {
3189
uses_blend_alpha = true; // Force alpha used because of blend.
3190
}
3191
3192
valid = true;
3193
}
3194
3195
bool SceneShaderData::is_animated() const {
3196
return (uses_fragment_time && uses_discard) || (uses_vertex_time && uses_vertex);
3197
}
3198
3199
bool SceneShaderData::casts_shadows() const {
3200
bool has_read_screen_alpha = uses_screen_texture || uses_depth_texture || uses_normal_texture;
3201
bool has_base_alpha = (uses_alpha && !uses_alpha_clip) || has_read_screen_alpha;
3202
bool has_alpha = has_base_alpha || uses_blend_alpha;
3203
3204
return !has_alpha || (uses_depth_prepass_alpha && !(depth_draw == DEPTH_DRAW_DISABLED || depth_test != DEPTH_TEST_ENABLED));
3205
}
3206
3207
RS::ShaderNativeSourceCode SceneShaderData::get_native_source_code() const {
3208
return MaterialStorage::get_singleton()->shaders.scene_shader.version_get_native_source_code(version);
3209
}
3210
3211
SceneShaderData::SceneShaderData() {
3212
valid = false;
3213
uses_screen_texture = false;
3214
}
3215
3216
SceneShaderData::~SceneShaderData() {
3217
if (version.is_valid()) {
3218
MaterialStorage::get_singleton()->shaders.scene_shader.version_free(version);
3219
}
3220
}
3221
3222
GLES3::ShaderData *GLES3::_create_scene_shader_func() {
3223
SceneShaderData *shader_data = memnew(SceneShaderData);
3224
return shader_data;
3225
}
3226
3227
void SceneMaterialData::set_render_priority(int p_priority) {
3228
priority = p_priority - RS::MATERIAL_RENDER_PRIORITY_MIN; //8 bits
3229
}
3230
3231
void SceneMaterialData::set_next_pass(RID p_pass) {
3232
next_pass = p_pass;
3233
}
3234
3235
void SceneMaterialData::update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
3236
update_parameters_internal(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, true);
3237
}
3238
3239
SceneMaterialData::~SceneMaterialData() {
3240
}
3241
3242
GLES3::MaterialData *GLES3::_create_scene_material_func(ShaderData *p_shader) {
3243
SceneMaterialData *material_data = memnew(SceneMaterialData);
3244
material_data->shader_data = static_cast<SceneShaderData *>(p_shader);
3245
//update will happen later anyway so do nothing.
3246
return material_data;
3247
}
3248
3249
void SceneMaterialData::bind_uniforms() {
3250
// Bind Material Uniforms
3251
glBindBufferBase(GL_UNIFORM_BUFFER, SCENE_MATERIAL_UNIFORM_LOCATION, uniform_buffer);
3252
3253
bind_uniforms_generic(texture_cache, shader_data->texture_uniforms);
3254
}
3255
3256
/* Particles SHADER */
3257
3258
void ParticlesShaderData::set_code(const String &p_code) {
3259
// Initialize and compile the shader.
3260
3261
code = p_code;
3262
valid = false;
3263
ubo_size = 0;
3264
uniforms.clear();
3265
3266
uses_collision = false;
3267
uses_time = false;
3268
3269
if (code.is_empty()) {
3270
return; // Just invalid, but no error.
3271
}
3272
3273
ShaderCompiler::GeneratedCode gen_code;
3274
3275
ShaderCompiler::IdentifierActions actions;
3276
actions.entry_point_stages["start"] = ShaderCompiler::STAGE_VERTEX;
3277
actions.entry_point_stages["process"] = ShaderCompiler::STAGE_VERTEX;
3278
3279
actions.usage_flag_pointers["COLLIDED"] = &uses_collision;
3280
3281
userdata_count = 0;
3282
for (uint32_t i = 0; i < PARTICLES_MAX_USERDATAS; i++) {
3283
userdatas_used[i] = false;
3284
actions.usage_flag_pointers["USERDATA" + itos(i + 1)] = &userdatas_used[i];
3285
}
3286
3287
actions.uniforms = &uniforms;
3288
3289
Error err = MaterialStorage::get_singleton()->shaders.compiler_particles.compile(RS::SHADER_PARTICLES, code, &actions, path, gen_code);
3290
ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed.");
3291
3292
if (version.is_null()) {
3293
version = MaterialStorage::get_singleton()->shaders.particles_process_shader.version_create();
3294
}
3295
3296
for (uint32_t i = 0; i < PARTICLES_MAX_USERDATAS; i++) {
3297
if (userdatas_used[i]) {
3298
userdata_count++;
3299
}
3300
}
3301
3302
LocalVector<ShaderGLES3::TextureUniformData> texture_uniform_data = get_texture_uniform_data(gen_code.texture_uniforms);
3303
3304
MaterialStorage::get_singleton()->shaders.particles_process_shader.version_set_code(version, gen_code.code, gen_code.uniforms, gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX], gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT], gen_code.defines, texture_uniform_data);
3305
ERR_FAIL_COND(!MaterialStorage::get_singleton()->shaders.particles_process_shader.version_is_valid(version));
3306
3307
ubo_size = gen_code.uniform_total_size;
3308
ubo_offsets = gen_code.uniform_offsets;
3309
texture_uniforms = gen_code.texture_uniforms;
3310
3311
valid = true;
3312
}
3313
3314
bool ParticlesShaderData::is_animated() const {
3315
return false;
3316
}
3317
3318
bool ParticlesShaderData::casts_shadows() const {
3319
return false;
3320
}
3321
3322
RS::ShaderNativeSourceCode ParticlesShaderData::get_native_source_code() const {
3323
return MaterialStorage::get_singleton()->shaders.particles_process_shader.version_get_native_source_code(version);
3324
}
3325
3326
ParticlesShaderData::~ParticlesShaderData() {
3327
if (version.is_valid()) {
3328
MaterialStorage::get_singleton()->shaders.particles_process_shader.version_free(version);
3329
}
3330
}
3331
3332
GLES3::ShaderData *GLES3::_create_particles_shader_func() {
3333
ParticlesShaderData *shader_data = memnew(ParticlesShaderData);
3334
return shader_data;
3335
}
3336
3337
void ParticleProcessMaterialData::update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
3338
update_parameters_internal(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, true);
3339
}
3340
3341
ParticleProcessMaterialData::~ParticleProcessMaterialData() {
3342
}
3343
3344
GLES3::MaterialData *GLES3::_create_particles_material_func(ShaderData *p_shader) {
3345
ParticleProcessMaterialData *material_data = memnew(ParticleProcessMaterialData);
3346
material_data->shader_data = static_cast<ParticlesShaderData *>(p_shader);
3347
//update will happen later anyway so do nothing.
3348
return material_data;
3349
}
3350
3351
void ParticleProcessMaterialData::bind_uniforms() {
3352
// Bind Material Uniforms
3353
glBindBufferBase(GL_UNIFORM_BUFFER, GLES3::PARTICLES_MATERIAL_UNIFORM_LOCATION, uniform_buffer);
3354
3355
bind_uniforms_generic(texture_cache, shader_data->texture_uniforms, 1); // Start at GL_TEXTURE1 because texture slot 0 is reserved for the heightmap texture.
3356
}
3357
3358
/* TextureBlit SHADER */
3359
3360
void TexBlitShaderData::set_code(const String &p_code) {
3361
// Initialize and compile the shader.
3362
3363
code = p_code;
3364
valid = false;
3365
ubo_size = 0;
3366
uniforms.clear();
3367
3368
if (code.is_empty()) {
3369
return; // Just invalid, but no error.
3370
}
3371
3372
ShaderCompiler::GeneratedCode gen_code;
3373
3374
// Actual enum set further down after compilation.
3375
int blend_modei = BLEND_MODE_MIX;
3376
3377
ShaderCompiler::IdentifierActions actions;
3378
actions.entry_point_stages["blit"] = ShaderCompiler::STAGE_FRAGMENT;
3379
3380
actions.render_mode_values["blend_add"] = Pair<int *, int>(&blend_modei, BLEND_MODE_ADD);
3381
actions.render_mode_values["blend_mix"] = Pair<int *, int>(&blend_modei, BLEND_MODE_MIX);
3382
actions.render_mode_values["blend_sub"] = Pair<int *, int>(&blend_modei, BLEND_MODE_SUB);
3383
actions.render_mode_values["blend_mul"] = Pair<int *, int>(&blend_modei, BLEND_MODE_MUL);
3384
actions.render_mode_values["blend_disabled"] = Pair<int *, int>(&blend_modei, BLEND_MODE_DISABLED);
3385
3386
actions.uniforms = &uniforms;
3387
Error err = MaterialStorage::get_singleton()->shaders.compiler_tex_blit.compile(RS::SHADER_TEXTURE_BLIT, code, &actions, path, gen_code);
3388
ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed.");
3389
3390
if (version.is_null()) {
3391
version = MaterialStorage::get_singleton()->shaders.tex_blit_shader.version_create();
3392
}
3393
3394
blend_mode = BlendMode(blend_modei);
3395
3396
#if 0
3397
print_line("**compiling shader:");
3398
print_line("**defines:\n");
3399
for (int i = 0; i < gen_code.defines.size(); i++) {
3400
print_line(gen_code.defines[i]);
3401
}
3402
3403
HashMap<String, String>::Iterator el = gen_code.code.begin();
3404
while (el) {
3405
print_line("\n**code " + el->key + ":\n" + el->value);
3406
++el;
3407
}
3408
3409
print_line("\n**uniforms:\n" + gen_code.uniforms);
3410
print_line("\n**vertex_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX]);
3411
print_line("\n**fragment_globals:\n" + gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT]);
3412
#endif
3413
3414
LocalVector<ShaderGLES3::TextureUniformData> texture_uniform_data = get_texture_uniform_data(gen_code.texture_uniforms);
3415
3416
MaterialStorage::get_singleton()->shaders.tex_blit_shader.version_set_code(version, gen_code.code, gen_code.uniforms, gen_code.stage_globals[ShaderCompiler::STAGE_VERTEX], gen_code.stage_globals[ShaderCompiler::STAGE_FRAGMENT], gen_code.defines, texture_uniform_data);
3417
ERR_FAIL_COND(!MaterialStorage::get_singleton()->shaders.tex_blit_shader.version_is_valid(version));
3418
3419
ubo_size = gen_code.uniform_total_size;
3420
ubo_offsets = gen_code.uniform_offsets;
3421
texture_uniforms = gen_code.texture_uniforms;
3422
3423
valid = true;
3424
}
3425
3426
bool TexBlitShaderData::is_animated() const {
3427
return false;
3428
}
3429
3430
bool TexBlitShaderData::casts_shadows() const {
3431
return false;
3432
}
3433
3434
RS::ShaderNativeSourceCode TexBlitShaderData::get_native_source_code() const {
3435
return MaterialStorage::get_singleton()->shaders.tex_blit_shader.version_get_native_source_code(version);
3436
}
3437
3438
TexBlitShaderData::TexBlitShaderData() {
3439
valid = false;
3440
}
3441
3442
TexBlitShaderData::~TexBlitShaderData() {
3443
if (version.is_valid()) {
3444
MaterialStorage::get_singleton()->shaders.tex_blit_shader.version_free(version);
3445
}
3446
}
3447
3448
GLES3::ShaderData *GLES3::_create_tex_blit_shader_func() {
3449
TexBlitShaderData *shader_data = memnew(TexBlitShaderData);
3450
return shader_data;
3451
}
3452
3453
void TexBlitMaterialData::update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
3454
update_parameters_internal(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, false);
3455
}
3456
3457
void TexBlitMaterialData::bind_uniforms() {
3458
glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniform_buffer);
3459
3460
bind_uniforms_generic(texture_cache, shader_data->texture_uniforms, 1);
3461
}
3462
3463
TexBlitMaterialData::~TexBlitMaterialData() {
3464
}
3465
3466
GLES3::MaterialData *GLES3::_create_tex_blit_material_func(ShaderData *p_shader) {
3467
TexBlitMaterialData *material_data = memnew(TexBlitMaterialData);
3468
material_data->shader_data = static_cast<TexBlitShaderData *>(p_shader);
3469
//update will happen later anyway so do nothing.
3470
return material_data;
3471
}
3472
3473
#endif // !GLES3_ENABLED
3474
3475