From 0dbbe423d9b8aae6960b13e38c052ded5596177b Mon Sep 17 00:00:00 2001
From: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
Date: Fri, 5 Jun 2020 15:36:26 +0200
Subject: [PATCH] c/layer_renderer: Implement eye visibility.

---
 doc/changes/compositor/mr.394.2.md      |  2 ++
 src/xrt/compositor/main/comp_layer.c    | 11 +++++++++--
 src/xrt/compositor/main/comp_layer.h    |  2 +-
 src/xrt/compositor/main/comp_renderer.c |  1 +
 4 files changed, 13 insertions(+), 3 deletions(-)
 create mode 100644 doc/changes/compositor/mr.394.2.md

diff --git a/doc/changes/compositor/mr.394.2.md b/doc/changes/compositor/mr.394.2.md
new file mode 100644
index 000000000..b26dd7121
--- /dev/null
+++ b/doc/changes/compositor/mr.394.2.md
@@ -0,0 +1,2 @@
+layer_rendering: Use the visibility flags on quad to correctly show the layers
+in each eye.
diff --git a/src/xrt/compositor/main/comp_layer.c b/src/xrt/compositor/main/comp_layer.c
index d444f6f33..fffa2b028 100644
--- a/src/xrt/compositor/main/comp_layer.c
+++ b/src/xrt/compositor/main/comp_layer.c
@@ -161,8 +161,8 @@ _init(struct comp_render_layer *self,
 
 	self->type = type;
 
-	self->visible = true;
 	self->view_space = true;
+	self->visibility = XRT_LAYER_EYE_VISIBILITY_BOTH;
 
 	math_matrix_4x4_identity(&self->model_matrix);
 
@@ -206,8 +206,15 @@ comp_layer_draw(struct comp_render_layer *self,
                 const struct xrt_matrix_4x4 *vp_world,
                 const struct xrt_matrix_4x4 *vp_eye)
 {
-	if (!self->visible)
+	if (eye == 0 &&
+	    (self->visibility & XRT_LAYER_EYE_VISIBILITY_LEFT_BIT) == 0) {
 		return;
+	}
+
+	if (eye == 1 &&
+	    (self->visibility & XRT_LAYER_EYE_VISIBILITY_RIGHT_BIT) == 0) {
+		return;
+	}
 
 	self->vk->vkCmdBindPipeline(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
 	                            pipeline);
diff --git a/src/xrt/compositor/main/comp_layer.h b/src/xrt/compositor/main/comp_layer.h
index c2a60ac1e..d7ea73513 100644
--- a/src/xrt/compositor/main/comp_layer.h
+++ b/src/xrt/compositor/main/comp_layer.h
@@ -22,7 +22,7 @@ struct comp_render_layer
 {
 	struct vk_bundle *vk;
 
-	bool visible;
+	enum xrt_layer_eye_visibility visibility;
 	bool view_space;
 
 	enum xrt_layer_type type;
diff --git a/src/xrt/compositor/main/comp_renderer.c b/src/xrt/compositor/main/comp_renderer.c
index c99bf3d05..862e6e2bd 100644
--- a/src/xrt/compositor/main/comp_renderer.c
+++ b/src/xrt/compositor/main/comp_renderer.c
@@ -502,6 +502,7 @@ comp_renderer_set_quad_layer(struct comp_renderer *r,
 	comp_layer_set_flip_y(r->lr->layers[layer], data->flip_y);
 
 	r->lr->layers[layer]->type = XRT_LAYER_QUAD;
+	r->lr->layers[layer]->visibility = data->quad.visibility;
 	r->lr->layers[layer]->view_space =
 	    (data->flags & XRT_LAYER_COMPOSITION_VIEW_SPACE_BIT) != 0;
 
-- 
GitLab