[gtk+/wip/otte/vulkan: 8/28] vulkan: Add GskVulkanRender object
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/otte/vulkan: 8/28] vulkan: Add GskVulkanRender object
- Date: Fri, 9 Dec 2016 06:27:43 +0000 (UTC)
commit 8ad4223e1d03187841128822f711afb5ee5877bb
Author: Benjamin Otte <otte redhat com>
Date: Wed Dec 7 14:50:52 2016 +0100
vulkan: Add GskVulkanRender object
This is refactoring work.
GskVulkanRender is supposed to be the global object for a render
operation, ie GskVulkanRenderer.render() will create this object for
what it does.
The object will be split into stages that perform the operations
necessary to create a drawing.
gsk/Makefile.am | 2 +
gsk/gskvulkanrender.c | 69 ++++++++++++++++++++++++++++++++++++++++++
gsk/gskvulkanrenderer.c | 61 +++++++------------------------------
gsk/gskvulkanrenderprivate.h | 29 +++++++++++++++++
4 files changed, 111 insertions(+), 50 deletions(-)
---
diff --git a/gsk/Makefile.am b/gsk/Makefile.am
index a29ebc5..bde8dbe 100644
--- a/gsk/Makefile.am
+++ b/gsk/Makefile.am
@@ -28,6 +28,7 @@ gsk_private_vulan_source_h = \
gskvulkanimageprivate.h \
gskvulkanmemoryprivate.h \
gskvulkanpipelineprivate.h \
+ gskvulkanrenderprivate.h \
gskvulkanrendererprivate.h \
gskvulkanshaderprivate.h
gsk_private_vulkan_source_c = \
@@ -35,6 +36,7 @@ gsk_private_vulkan_source_c = \
gskvulkanimage.c \
gskvulkanmemory.c \
gskvulkanpipeline.c \
+ gskvulkanrender.c \
gskvulkanrenderer.c \
gskvulkanshader.c
endif
diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c
new file mode 100644
index 0000000..3dff0bf
--- /dev/null
+++ b/gsk/gskvulkanrender.c
@@ -0,0 +1,69 @@
+#include "config.h"
+
+#include "gskvulkanrenderprivate.h"
+
+#include "gskvulkanpipelineprivate.h"
+
+void
+gsk_vulkan_render_init (GskVulkanRender *self,
+ GdkVulkanContext *context,
+ VkCommandPool command_pool)
+{
+ self->vulkan = context;
+ self->command_pool = command_pool;
+
+ GSK_VK_CHECK (vkAllocateCommandBuffers, gdk_vulkan_context_get_device (self->vulkan),
+ &(VkCommandBufferAllocateInfo) {
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+ .commandPool = self->command_pool,
+ .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+ .commandBufferCount = 1,
+ },
+ &self->command_buffer);
+
+ GSK_VK_CHECK (vkBeginCommandBuffer, self->command_buffer,
+ &(VkCommandBufferBeginInfo) {
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+ .flags = 0
+ });
+}
+
+void
+gsk_vulkan_render_submit (GskVulkanRender *self,
+ VkFence fence)
+{
+ GSK_VK_CHECK (vkEndCommandBuffer, self->command_buffer);
+
+ GSK_VK_CHECK (vkQueueSubmit, gdk_vulkan_context_get_queue (self->vulkan),
+ 1,
+ &(VkSubmitInfo) {
+ .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
+ .waitSemaphoreCount = 1,
+ .pWaitSemaphores = (VkSemaphore[1]) {
+ gdk_vulkan_context_get_draw_semaphore (self->vulkan),
+ },
+ .pWaitDstStageMask = (VkPipelineStageFlags []) {
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ },
+ .commandBufferCount = 1,
+ .pCommandBuffers = &self->command_buffer,
+ },
+ fence);
+
+ GSK_VK_CHECK (vkWaitForFences, gdk_vulkan_context_get_device (self->vulkan),
+ 1,
+ &fence,
+ VK_TRUE,
+ INT64_MAX);
+ GSK_VK_CHECK (vkResetFences, gdk_vulkan_context_get_device (self->vulkan),
+ 1,
+ &fence);
+}
+
+void
+gsk_vulkan_render_finish (GskVulkanRender *self)
+{
+ GSK_VK_CHECK (vkResetCommandPool, gdk_vulkan_context_get_device (self->vulkan),
+ self->command_pool,
+ 0);
+}
diff --git a/gsk/gskvulkanrenderer.c b/gsk/gskvulkanrenderer.c
index e2f9591..9856f3f 100644
--- a/gsk/gskvulkanrenderer.c
+++ b/gsk/gskvulkanrenderer.c
@@ -11,6 +11,7 @@
#include "gskvulkanbufferprivate.h"
#include "gskvulkanimageprivate.h"
#include "gskvulkanpipelineprivate.h"
+#include "gskvulkanrenderprivate.h"
#include <graphene.h>
@@ -524,7 +525,7 @@ gsk_vulkan_renderer_render (GskRenderer *renderer,
GskRenderNode *root)
{
GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer);
- VkCommandBuffer command_buffer;
+ GskVulkanRender render;
GskVulkanImage *image;
#ifdef G_ENABLE_DEBUG
GskProfiler *profiler;
@@ -536,58 +537,18 @@ gsk_vulkan_renderer_render (GskRenderer *renderer,
gsk_profiler_timer_begin (profiler, self->profile_timers.cpu_time);
#endif
- GSK_VK_CHECK (vkAllocateCommandBuffers, gdk_vulkan_context_get_device (self->vulkan),
- &(VkCommandBufferAllocateInfo) {
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
- .commandPool = self->command_pool,
- .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
- .commandBufferCount = 1,
- },
- &command_buffer);
-
- GSK_VK_CHECK (vkBeginCommandBuffer, command_buffer,
- &(VkCommandBufferBeginInfo) {
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
- .flags = 0
- });
-
- image = gsk_vulkan_renderer_prepare_render (self, command_buffer, root);
-
- gsk_vulkan_renderer_do_render_pass (self, command_buffer, image);
-
- GSK_VK_CHECK (vkEndCommandBuffer, command_buffer);
-
- GSK_VK_CHECK (vkQueueSubmit, gdk_vulkan_context_get_queue (self->vulkan),
- 1,
- &(VkSubmitInfo) {
- .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
- .waitSemaphoreCount = 1,
- .pWaitSemaphores = (VkSemaphore[1]) {
- gdk_vulkan_context_get_draw_semaphore (self->vulkan),
- },
- .pWaitDstStageMask = (VkPipelineStageFlags []) {
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
- },
- .commandBufferCount = 1,
- .pCommandBuffers = &command_buffer,
- },
- self->command_pool_fence);
-
- GSK_VK_CHECK (vkWaitForFences, gdk_vulkan_context_get_device (self->vulkan),
- 1,
- &self->command_pool_fence,
- true,
- INT64_MAX);
- GSK_VK_CHECK (vkResetFences, gdk_vulkan_context_get_device (self->vulkan),
- 1,
- &self->command_pool_fence);
+ gsk_vulkan_render_init (&render, self->vulkan, self->command_pool);
+
+ image = gsk_vulkan_renderer_prepare_render (self, render.command_buffer, root);
+
+ gsk_vulkan_renderer_do_render_pass (self, render.command_buffer, image);
+
+ gsk_vulkan_render_submit (&render, self->command_pool_fence);
- GSK_VK_CHECK (vkResetCommandPool, gdk_vulkan_context_get_device (self->vulkan),
- self->command_pool,
- 0);
-
gsk_vulkan_image_free (image);
+ gsk_vulkan_render_finish (&render);
+
#ifdef G_ENABLE_DEBUG
cpu_time = gsk_profiler_timer_end (profiler, self->profile_timers.cpu_time);
gsk_profiler_timer_set (profiler, self->profile_timers.cpu_time, cpu_time);
diff --git a/gsk/gskvulkanrenderprivate.h b/gsk/gskvulkanrenderprivate.h
new file mode 100644
index 0000000..c1f3202
--- /dev/null
+++ b/gsk/gskvulkanrenderprivate.h
@@ -0,0 +1,29 @@
+#ifndef __GSK_VULKAN_RENDER_PRIVATE_H__
+#define __GSK_VULKAN_RENDER_PRIVATE_H__
+
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GskVulkanRender GskVulkanRender;
+
+struct _GskVulkanRender
+{
+ GdkVulkanContext *vulkan;
+
+ VkCommandPool command_pool;
+ VkCommandBuffer command_buffer;
+};
+
+void gsk_vulkan_render_init (GskVulkanRender *self,
+ GdkVulkanContext *context,
+ VkCommandPool
command_pool);
+
+void gsk_vulkan_render_submit (GskVulkanRender *self,
+ VkFence fence);
+
+void gsk_vulkan_render_finish (GskVulkanRender *self);
+
+G_END_DECLS
+
+#endif /* __GSK_VULKAN_RENDER_PRIVATE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]