Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2022-03-19 22:40:13 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-03-20 00:05:34 +0300
commit6ae03375b6c7270b321d980f49feaf4412e0c0f0 (patch)
tree18d79bfb324a6a79111332799a8dd6afa295bcd6
parent3eaf3453529c40bda6d079cc3942abb678489e1a (diff)
DRW: Make use of shader shared header
# Conflicts: # source/blender/draw/intern/draw_manager.h # source/blender/draw/intern/draw_manager_exec.c # source/blender/draw/intern/draw_shader_shared.h
-rw-r--r--source/blender/draw/intern/draw_manager.c2
-rw-r--r--source/blender/draw/intern/draw_manager.h23
-rw-r--r--source/blender/draw/intern/draw_manager_data.c10
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c14
-rw-r--r--source/blender/draw/intern/draw_shader_shared.h12
5 files changed, 32 insertions, 29 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 742584b568f..39ae01697a1 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -616,7 +616,7 @@ static void drw_manager_init(DRWManager *dst, GPUViewport *viewport, const int s
}
if (G_draw.view_ubo == NULL) {
- G_draw.view_ubo = GPU_uniformbuf_create_ex(sizeof(DRWViewUboStorage), NULL, "G_draw.view_ubo");
+ G_draw.view_ubo = GPU_uniformbuf_create_ex(sizeof(ViewInfos), NULL, "G_draw.view_ubo");
}
if (dst->draw_list == NULL) {
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 6a50348533f..eb73ab78a1a 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -27,6 +27,7 @@
#include "GPU_viewport.h"
#include "draw_instance_data.h"
+#include "draw_shader_shared.h"
#ifdef __cplusplus
extern "C" {
@@ -424,31 +425,13 @@ struct DRWPass {
char name[MAX_PASS_NAME];
};
-/* keep in sync with viewBlock */
-typedef struct DRWViewUboStorage {
- /* View matrices */
- float persmat[4][4];
- float persinv[4][4];
- float viewmat[4][4];
- float viewinv[4][4];
- float winmat[4][4];
- float wininv[4][4];
-
- float clipplanes[6][4];
- float viewvecs[2][4];
- /* Should not be here. Not view dependent (only main view). */
- float viewcamtexcofac[4];
-} DRWViewUboStorage;
-
-BLI_STATIC_ASSERT_ALIGN(DRWViewUboStorage, 16)
-
#define MAX_CULLED_VIEWS 32
struct DRWView {
/** Parent view if this is a sub view. NULL otherwise. */
struct DRWView *parent;
- DRWViewUboStorage storage;
+ ViewInfos storage;
/** Number of active clipplanes. */
int clip_planes_len;
/** Does culling result needs to be updated. */
@@ -633,7 +616,7 @@ typedef struct DRWManager {
uint primary_view_ct;
/** TODO(@fclem): Remove this. Only here to support
* shaders without common_view_lib.glsl */
- DRWViewUboStorage view_storage_cpy;
+ ViewInfos view_storage_cpy;
#ifdef USE_GPU_SELECT
uint select_id;
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index a069a4e756c..b01c901c77f 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -1825,7 +1825,7 @@ static void draw_frustum_bound_sphere_calc(const BoundBox *bbox,
}
}
-static void draw_view_matrix_state_update(DRWViewUboStorage *storage,
+static void draw_view_matrix_state_update(ViewInfos *storage,
const float viewmat[4][4],
const float winmat[4][4])
{
@@ -2037,7 +2037,7 @@ void DRW_view_clip_planes_set(DRWView *view, float (*planes)[4], int plane_len)
BLI_assert(plane_len <= MAX_CLIP_PLANES);
view->clip_planes_len = plane_len;
if (plane_len > 0) {
- memcpy(view->storage.clipplanes, planes, sizeof(float[4]) * plane_len);
+ memcpy(view->storage.clip_planes, planes, sizeof(float[4]) * plane_len);
}
}
@@ -2089,21 +2089,21 @@ float DRW_view_far_distance_get(const DRWView *view)
void DRW_view_viewmat_get(const DRWView *view, float mat[4][4], bool inverse)
{
view = (view) ? view : DST.view_default;
- const DRWViewUboStorage *storage = &view->storage;
+ const ViewInfos *storage = &view->storage;
copy_m4_m4(mat, (inverse) ? storage->viewinv : storage->viewmat);
}
void DRW_view_winmat_get(const DRWView *view, float mat[4][4], bool inverse)
{
view = (view) ? view : DST.view_default;
- const DRWViewUboStorage *storage = &view->storage;
+ const ViewInfos *storage = &view->storage;
copy_m4_m4(mat, (inverse) ? storage->wininv : storage->winmat);
}
void DRW_view_persmat_get(const DRWView *view, float mat[4][4], bool inverse)
{
view = (view) ? view : DST.view_default;
- const DRWViewUboStorage *storage = &view->storage;
+ const ViewInfos *storage = &view->storage;
copy_m4_m4(mat, (inverse) ? storage->persinv : storage->persmat);
}
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 682a91ee7d4..7d6ce51ff35 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1068,8 +1068,13 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
}
}
-static void drw_update_view(void)
+static void drw_update_view(const float viewport_size[2])
{
+ ViewInfos *storage = &DST.view_active->storage;
+ copy_v2_v2(storage->viewport_size, viewport_size);
+ copy_v2_v2(storage->viewport_size_inverse, viewport_size);
+ invert_v2(storage->viewport_size_inverse);
+
/* TODO(fclem): update a big UBO and only bind ranges here. */
GPU_uniformbuf_update(G_draw.view_ubo, &DST.view_active->storage);
@@ -1097,8 +1102,11 @@ static void drw_draw_pass_ex(DRWPass *pass,
BLI_assert(DST.buffer_finish_called &&
"DRW_render_instance_buffer_finish had not been called before drawing");
- if (DST.view_previous != DST.view_active || DST.view_active->is_dirty) {
- drw_update_view();
+ float viewport[4];
+ GPU_viewport_size_get_f(viewport);
+ if (DST.view_previous != DST.view_active || DST.view_active->is_dirty ||
+ !equals_v2v2(DST.view_active->storage.viewport_size, &viewport[2])) {
+ drw_update_view(&viewport[2]);
DST.view_active->is_dirty = false;
DST.view_previous = DST.view_active;
}
diff --git a/source/blender/draw/intern/draw_shader_shared.h b/source/blender/draw/intern/draw_shader_shared.h
index 687cf8bd2fb..7c71ae9e21f 100644
--- a/source/blender/draw/intern/draw_shader_shared.h
+++ b/source/blender/draw/intern/draw_shader_shared.h
@@ -2,6 +2,10 @@
#ifndef GPU_SHADER
# include "GPU_shader_shared_utils.h"
+
+typedef struct ViewInfos ViewInfos;
+typedef struct ObjectMatrices ObjectMatrices;
+typedef struct ObjectInfos ObjectInfos;
#endif
#define DRW_SHADER_SHARED_H
@@ -21,6 +25,14 @@ struct ViewInfos {
float4 viewvecs[2];
/* Should not be here. Not view dependent (only main view). */
float4 viewcamtexcofac;
+
+ float2 viewport_size;
+ float2 viewport_size_inverse;
+
+ /** Frustum culling data. */
+ /** NOTE: vec3 arrays are paded to vec4. */
+ float4 frustum_corners[8];
+ float4 frustum_planes[6];
};
BLI_STATIC_ASSERT_ALIGN(ViewInfos, 16)