summaryrefslogtreecommitdiff
path: root/drivers/gles3/rasterizer_storage_gles3.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gles3/rasterizer_storage_gles3.h')
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.h215
1 files changed, 113 insertions, 102 deletions
diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h
index eb5614f70f..4a4469d40a 100644
--- a/drivers/gles3/rasterizer_storage_gles3.h
+++ b/drivers/gles3/rasterizer_storage_gles3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,21 +31,17 @@
#ifndef RASTERIZER_STORAGE_OPENGL_H
#define RASTERIZER_STORAGE_OPENGL_H
-#include "drivers/gles3/rasterizer_platforms.h"
-#ifdef GLES3_BACKEND_ENABLED
+#ifdef GLES3_ENABLED
#include "core/templates/local_vector.h"
#include "core/templates/rid_owner.h"
#include "core/templates/self_list.h"
-#include "drivers/gles3/rasterizer_asserts.h"
#include "servers/rendering/renderer_compositor.h"
#include "servers/rendering/renderer_storage.h"
+#include "servers/rendering/shader_compiler.h"
#include "servers/rendering/shader_language.h"
-#include "shader_compiler_gles3.h"
-#include "shader_gles3.h"
#include "shaders/copy.glsl.gen.h"
-#include "shaders/cubemap_filter.glsl.gen.h"
class RasterizerCanvasGLES3;
class RasterizerSceneGLES3;
@@ -83,7 +79,6 @@ public:
bool bptc_supported;
bool etc_supported;
bool etc2_supported;
- bool pvrtc_supported;
bool srgb_decode_supported;
bool keep_original_textures;
@@ -134,14 +129,15 @@ public:
} resources;
mutable struct Shaders {
- ShaderCompilerGLES3 compiler;
+ ShaderCompiler compiler;
CopyShaderGLES3 copy;
- CubemapFilterShaderGLES3 cubemap_filter;
+ RID copy_version;
+ //CubemapFilterShaderGLES3 cubemap_filter;
- ShaderCompilerGLES3::IdentifierActions actions_canvas;
- ShaderCompilerGLES3::IdentifierActions actions_scene;
- ShaderCompilerGLES3::IdentifierActions actions_particles;
+ ShaderCompiler::IdentifierActions actions_canvas;
+ ShaderCompiler::IdentifierActions actions_scene;
+ ShaderCompiler::IdentifierActions actions_particles;
} shaders;
@@ -183,62 +179,6 @@ public:
void bind_quad_array() const;
/////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////DATA///////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////
-
- /*
- struct Instantiable {
- RID self;
-
- SelfList<InstanceBaseDependency>::List instance_list;
-
- _FORCE_INLINE_ void instance_change_notify(bool p_aabb, bool p_materials) {
- SelfList<InstanceBaseDependency> *instances = instance_list.first();
- while (instances) {
- instances->self()->base_changed(p_aabb, p_materials);
- instances = instances->next();
- }
- }
-
- _FORCE_INLINE_ void instance_remove_deps() {
- SelfList<InstanceBaseDependency> *instances = instance_list.first();
-
- while (instances) {
- instances->self()->base_removed();
- instances = instances->next();
- }
- }
-
- Instantiable() {}
-
- ~Instantiable() {}
- };
-
- struct GeometryOwner : public Instantiable {
- };
-
- struct Geometry : public Instantiable {
- enum Type {
- GEOMETRY_INVALID,
- GEOMETRY_SURFACE,
- GEOMETRY_IMMEDIATE,
- GEOMETRY_MULTISURFACE
- };
-
- Type type;
- RID material;
- uint64_t last_pass;
- uint32_t index;
-
- void material_changed_notify() {}
-
- Geometry() {
- last_pass = 0;
- index = 0;
- }
- };
-*/
- /////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////API////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
@@ -257,6 +197,26 @@ public:
TEXTURE_FLAGS_DEFAULT = TEXTURE_FLAG_REPEAT | TEXTURE_FLAG_MIPMAPS | TEXTURE_FLAG_FILTER
};
+ /* CANVAS TEXTURE API (2D) */
+
+ struct CanvasTexture {
+ RID diffuse;
+ RID normal_map;
+ RID specular;
+ Color specular_color = Color(1, 1, 1, 1);
+ float shininess = 1.0;
+
+ RS::CanvasItemTextureFilter texture_filter = RS::CANVAS_ITEM_TEXTURE_FILTER_DEFAULT;
+ RS::CanvasItemTextureRepeat texture_repeat = RS::CANVAS_ITEM_TEXTURE_REPEAT_DEFAULT;
+
+ Size2i size_cache = Size2i(1, 1);
+ bool use_normal_cache = false;
+ bool use_specular_cache = false;
+ bool cleared_cache = true;
+ };
+
+ RID_Owner<CanvasTexture, true> canvas_texture_owner;
+
struct RenderTarget;
struct Texture {
@@ -309,6 +269,8 @@ public:
RS::TextureDetectCallback detect_normal;
void *detect_normal_ud;
+ CanvasTexture *canvas_texture = nullptr;
+
// some silly opengl shenanigans where
// texture coords start from bottom left, means we need to draw render target textures upside down
// to be compatible with vulkan etc.
@@ -436,7 +398,7 @@ public:
glTexParameteri(p_target, GL_TEXTURE_MIN_FILTER, pmin);
glTexParameteri(p_target, GL_TEXTURE_MAG_FILTER, pmag);
}
- void GLSetRepeat(RS::CanvasItemTextureRepeat p_repeat) {
+ void GLSetRepeat(GLenum p_target, RS::CanvasItemTextureRepeat p_repeat) {
if (p_repeat == state_repeat)
return;
state_repeat = p_repeat;
@@ -451,8 +413,8 @@ public:
prep = GL_MIRRORED_REPEAT;
} break;
}
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, prep);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, prep);
+ glTexParameteri(p_target, GL_TEXTURE_WRAP_S, prep);
+ glTexParameteri(p_target, GL_TEXTURE_WRAP_T, prep);
}
private:
@@ -540,10 +502,10 @@ public:
void canvas_texture_initialize(RID p_rid) override;
void canvas_texture_set_channel(RID p_canvas_texture, RS::CanvasTextureChannel p_channel, RID p_texture) override;
- void canvas_texture_set_shading_parameters(RID p_canvas_texture, const Color &p_base_color, float p_shininess) override;
+ void canvas_texture_set_shading_parameters(RID p_canvas_texture, const Color &p_specular_color, float p_shininess) override;
- void canvas_texture_set_texture_filter(RID p_item, RS::CanvasItemTextureFilter p_filter) override;
- void canvas_texture_set_texture_repeat(RID p_item, RS::CanvasItemTextureRepeat p_repeat) override;
+ void canvas_texture_set_texture_filter(RID p_canvas_texture, RS::CanvasItemTextureFilter p_filter) override;
+ void canvas_texture_set_texture_repeat(RID p_canvas_texture, RS::CanvasItemTextureRepeat p_repeat) override;
/* SKY API */
// not sure if used in godot 4?
@@ -573,16 +535,13 @@ public:
Map<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms;
- uint32_t texture_count;
-
- uint32_t custom_code_id;
- uint32_t version;
+ RID version;
SelfList<Shader> dirty_list;
- Map<StringName, RID> default_textures;
+ Map<StringName, Map<int, RID>> default_textures;
- Vector<ShaderLanguage::ShaderNode::Uniform::Hint> texture_hints;
+ Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
bool valid;
@@ -610,12 +569,6 @@ public:
int light_mode;
- // these flags are specifically for batching
- // some of the logic is thus in rasterizer_storage.cpp
- // we could alternatively set bitflags for each 'uses' and test on the fly
- // defined in RasterizerStorageCommon::BatchFlags
- unsigned int batch_flags;
-
bool uses_screen_texture;
bool uses_screen_uv;
bool uses_time;
@@ -686,8 +639,7 @@ public:
dirty_list(this) {
shader = NULL;
valid = false;
- custom_code_id = 0;
- version = 1;
+ version = RID();
last_pass = 0;
}
};
@@ -706,15 +658,11 @@ public:
String shader_get_code(RID p_shader) const override;
void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const override;
- void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture) override;
- RID shader_get_default_texture_param(RID p_shader, const StringName &p_name) const override;
+ void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index) override;
+ RID shader_get_default_texture_param(RID p_shader, const StringName &p_name, int p_index) const override;
RS::ShaderNativeSourceCode shader_get_native_source_code(RID p_shader) const override { return RS::ShaderNativeSourceCode(); };
- void shader_add_custom_define(RID p_shader, const String &p_define);
- void shader_get_custom_defines(RID p_shader, Vector<String> *p_defines) const;
- void shader_remove_custom_define(RID p_shader, const String &p_define);
-
void _update_shader(Shader *p_shader) const;
void update_dirty_shaders();
@@ -809,8 +757,8 @@ public:
void mesh_instance_set_blend_shape_weight(RID p_mesh_instance, int p_shape, float p_weight) override;
void mesh_instance_check_for_update(RID p_mesh_instance) override;
void update_mesh_instances() override;
- void reflection_probe_set_lod_threshold(RID p_probe, float p_ratio) override;
- float reflection_probe_get_lod_threshold(RID p_probe) const override;
+ void reflection_probe_set_mesh_lod_threshold(RID p_probe, float p_ratio) override;
+ float reflection_probe_get_mesh_lod_threshold(RID p_probe) const override;
void mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface) override;
@@ -838,6 +786,44 @@ public:
/* MULTIMESH API */
+ struct MultiMesh {
+ RID mesh;
+ int instances = 0;
+ RS::MultimeshTransformFormat xform_format = RS::MULTIMESH_TRANSFORM_3D;
+ bool uses_colors = false;
+ bool uses_custom_data = false;
+ int visible_instances = -1;
+ AABB aabb;
+ bool aabb_dirty = false;
+ bool buffer_set = false;
+ uint32_t stride_cache = 0;
+ uint32_t color_offset_cache = 0;
+ uint32_t custom_data_offset_cache = 0;
+
+ Vector<float> data_cache; //used if individual setting is used
+ bool *data_cache_dirty_regions = nullptr;
+ uint32_t data_cache_used_dirty_regions = 0;
+
+ RID buffer; //storage buffer
+ RID uniform_set_3d;
+ RID uniform_set_2d;
+
+ bool dirty = false;
+ MultiMesh *dirty_list = nullptr;
+
+ Dependency dependency;
+ };
+
+ mutable RID_Owner<MultiMesh, true> multimesh_owner;
+
+ MultiMesh *multimesh_dirty_list = nullptr;
+
+ _FORCE_INLINE_ void _multimesh_make_local(MultiMesh *multimesh) const;
+ _FORCE_INLINE_ void _multimesh_mark_dirty(MultiMesh *multimesh, int p_index, bool p_aabb);
+ _FORCE_INLINE_ void _multimesh_mark_all_dirty(MultiMesh *multimesh, bool p_data, bool p_aabb);
+ _FORCE_INLINE_ void _multimesh_re_create_aabb(MultiMesh *multimesh, const float *p_data, int p_instances);
+ void _update_dirty_multimeshes();
+
RID multimesh_allocate() override;
void multimesh_initialize(RID p_rid) override;
void multimesh_allocate_data(RID p_multimesh, int p_instances, RS::MultimeshTransformFormat p_transform_format, bool p_use_colors = false, bool p_use_custom_data = false) override;
@@ -862,6 +848,29 @@ public:
void multimesh_set_visible_instances(RID p_multimesh, int p_visible) override;
int multimesh_get_visible_instances(RID p_multimesh) const override;
+ _FORCE_INLINE_ RS::MultimeshTransformFormat multimesh_get_transform_format(RID p_multimesh) const {
+ MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh);
+ return multimesh->xform_format;
+ }
+
+ _FORCE_INLINE_ bool multimesh_uses_colors(RID p_multimesh) const {
+ MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh);
+ return multimesh->uses_colors;
+ }
+
+ _FORCE_INLINE_ bool multimesh_uses_custom_data(RID p_multimesh) const {
+ MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh);
+ return multimesh->uses_custom_data;
+ }
+
+ _FORCE_INLINE_ uint32_t multimesh_get_instances_to_draw(RID p_multimesh) const {
+ MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh);
+ if (multimesh->visible_instances >= 0) {
+ return multimesh->visible_instances;
+ }
+ return multimesh->instances;
+ }
+
/* SKELETON API */
RID skeleton_allocate() override;
@@ -1258,6 +1267,7 @@ public:
RID render_target_create() override;
void render_target_set_position(RID p_render_target, int p_x, int p_y) override;
void render_target_set_size(RID p_render_target, int p_width, int p_height, uint32_t p_view_count) override;
+ Size2i render_target_get_size(RID p_render_target);
RID render_target_get_texture(RID p_render_target) override;
void render_target_set_external_texture(RID p_render_target, unsigned int p_texture_id) override;
@@ -1325,12 +1335,12 @@ public:
struct Frame {
RenderTarget *current_rt;
- // these 2 may have been superceded by the equivalents in the render target.
+ // these 2 may have been superseded by the equivalents in the render target.
// these may be able to be removed.
bool clear_request;
Color clear_request_color;
- float time[4];
+ float time;
float delta;
uint64_t count;
@@ -1361,6 +1371,7 @@ public:
// int get_render_info(RS::RenderInfo p_info) override;
String get_video_adapter_name() const override;
String get_video_adapter_vendor() const override;
+ RenderingDevice::DeviceType get_video_adapter_type() const override;
void capture_timestamps_begin() override {}
void capture_timestamp(const String &p_name) override {}
@@ -1409,6 +1420,7 @@ public:
}
RasterizerStorageGLES3();
+ ~RasterizerStorageGLES3();
};
inline bool RasterizerStorageGLES3::safe_buffer_sub_data(unsigned int p_total_buffer_size, GLenum p_target, unsigned int p_offset, unsigned int p_data_size, const void *p_data, unsigned int &r_offset_after) const {
@@ -1444,10 +1456,9 @@ inline void RasterizerStorageGLES3::buffer_orphan_and_upload(unsigned int p_buff
}
#endif
}
- RAST_DEV_DEBUG_ASSERT((p_offset + p_data_size) <= p_buffer_size);
glBufferSubData(p_target, p_offset, p_data_size, p_data);
}
-#endif // GLES3_BACKEND_ENABLED
+#endif // GLES3_ENABLED
#endif // RASTERIZER_STORAGE_OPENGL_H