mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
vkfullscreenquad: support setting blend operations
Allows e.g. blending with an existing image. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470>
This commit is contained in:
parent
53596c2fc6
commit
fe8b4514e9
2 changed files with 161 additions and 4 deletions
|
@ -57,6 +57,14 @@ struct _GstVulkanFullScreenQuadPrivate
|
||||||
|
|
||||||
GstVulkanHandle *vert;
|
GstVulkanHandle *vert;
|
||||||
GstVulkanHandle *frag;
|
GstVulkanHandle *frag;
|
||||||
|
|
||||||
|
VkBool32 blend_enable;
|
||||||
|
VkBlendFactor src_blend_factor;
|
||||||
|
VkBlendFactor src_alpha_blend_factor;
|
||||||
|
VkBlendFactor dst_blend_factor;
|
||||||
|
VkBlendFactor dst_alpha_blend_factor;
|
||||||
|
VkBlendOp colour_blend_op;
|
||||||
|
VkBlendOp alpha_blend_op;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (GstVulkanFullScreenQuad, gst_vulkan_full_screen_quad,
|
G_DEFINE_TYPE_WITH_CODE (GstVulkanFullScreenQuad, gst_vulkan_full_screen_quad,
|
||||||
|
@ -278,6 +286,7 @@ create_pipeline_layout (GstVulkanFullScreenQuad * self, GError ** error)
|
||||||
static gboolean
|
static gboolean
|
||||||
create_render_pass (GstVulkanFullScreenQuad * self, GError ** error)
|
create_render_pass (GstVulkanFullScreenQuad * self, GError ** error)
|
||||||
{
|
{
|
||||||
|
GstVulkanFullScreenQuadPrivate *priv = GET_PRIV (self);
|
||||||
VkAttachmentDescription color_attachments[GST_VIDEO_MAX_PLANES];
|
VkAttachmentDescription color_attachments[GST_VIDEO_MAX_PLANES];
|
||||||
VkAttachmentReference color_attachment_refs[GST_VIDEO_MAX_PLANES];
|
VkAttachmentReference color_attachment_refs[GST_VIDEO_MAX_PLANES];
|
||||||
VkRenderPassCreateInfo render_pass_info;
|
VkRenderPassCreateInfo render_pass_info;
|
||||||
|
@ -468,19 +477,43 @@ create_pipeline (GstVulkanFullScreenQuad * self, GError ** error)
|
||||||
|
|
||||||
color_blend_attachments[0] = (VkPipelineColorBlendAttachmentState) {
|
color_blend_attachments[0] = (VkPipelineColorBlendAttachmentState) {
|
||||||
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
||||||
.blendEnable = VK_FALSE
|
.srcColorBlendFactor = priv->src_blend_factor,
|
||||||
|
.dstColorBlendFactor = priv->dst_blend_factor,
|
||||||
|
.colorBlendOp = priv->colour_blend_op,
|
||||||
|
.srcAlphaBlendFactor = priv->src_alpha_blend_factor,
|
||||||
|
.dstAlphaBlendFactor = priv->dst_alpha_blend_factor,
|
||||||
|
.alphaBlendOp = priv->alpha_blend_op,
|
||||||
|
.blendEnable = priv->blend_enable
|
||||||
};
|
};
|
||||||
color_blend_attachments[1] = (VkPipelineColorBlendAttachmentState) {
|
color_blend_attachments[1] = (VkPipelineColorBlendAttachmentState) {
|
||||||
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
||||||
.blendEnable = VK_FALSE
|
.srcColorBlendFactor = priv->src_blend_factor,
|
||||||
|
.dstColorBlendFactor = priv->dst_blend_factor,
|
||||||
|
.colorBlendOp = priv->colour_blend_op,
|
||||||
|
.srcAlphaBlendFactor = priv->src_alpha_blend_factor,
|
||||||
|
.dstAlphaBlendFactor = priv->dst_alpha_blend_factor,
|
||||||
|
.alphaBlendOp = priv->alpha_blend_op,
|
||||||
|
.blendEnable = priv->blend_enable
|
||||||
};
|
};
|
||||||
color_blend_attachments[2] = (VkPipelineColorBlendAttachmentState) {
|
color_blend_attachments[2] = (VkPipelineColorBlendAttachmentState) {
|
||||||
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
||||||
.blendEnable = VK_FALSE
|
.srcColorBlendFactor = priv->src_blend_factor,
|
||||||
|
.dstColorBlendFactor = priv->dst_blend_factor,
|
||||||
|
.colorBlendOp = priv->colour_blend_op,
|
||||||
|
.srcAlphaBlendFactor = priv->src_alpha_blend_factor,
|
||||||
|
.dstAlphaBlendFactor = priv->dst_alpha_blend_factor,
|
||||||
|
.alphaBlendOp = priv->alpha_blend_op,
|
||||||
|
.blendEnable = priv->blend_enable
|
||||||
};
|
};
|
||||||
color_blend_attachments[3] = (VkPipelineColorBlendAttachmentState) {
|
color_blend_attachments[3] = (VkPipelineColorBlendAttachmentState) {
|
||||||
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
|
||||||
.blendEnable = VK_FALSE
|
.srcColorBlendFactor = priv->src_blend_factor,
|
||||||
|
.dstColorBlendFactor = priv->dst_blend_factor,
|
||||||
|
.colorBlendOp = priv->colour_blend_op,
|
||||||
|
.srcAlphaBlendFactor = priv->src_alpha_blend_factor,
|
||||||
|
.dstAlphaBlendFactor = priv->dst_alpha_blend_factor,
|
||||||
|
.alphaBlendOp = priv->alpha_blend_op,
|
||||||
|
.blendEnable = priv->blend_enable
|
||||||
};
|
};
|
||||||
|
|
||||||
color_blending = (VkPipelineColorBlendStateCreateInfo) {
|
color_blending = (VkPipelineColorBlendStateCreateInfo) {
|
||||||
|
@ -768,7 +801,16 @@ destroy_pipeline (GstVulkanFullScreenQuad * self)
|
||||||
void
|
void
|
||||||
gst_vulkan_full_screen_quad_init (GstVulkanFullScreenQuad * self)
|
gst_vulkan_full_screen_quad_init (GstVulkanFullScreenQuad * self)
|
||||||
{
|
{
|
||||||
|
GstVulkanFullScreenQuadPrivate *priv = GET_PRIV (self);
|
||||||
|
|
||||||
self->trash_list = gst_vulkan_trash_fence_list_new ();
|
self->trash_list = gst_vulkan_trash_fence_list_new ();
|
||||||
|
|
||||||
|
priv->src_blend_factor = VK_BLEND_FACTOR_ONE;
|
||||||
|
priv->src_alpha_blend_factor = VK_BLEND_FACTOR_ONE;
|
||||||
|
priv->dst_blend_factor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
||||||
|
priv->dst_alpha_blend_factor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
||||||
|
priv->colour_blend_op = VK_BLEND_OP_ADD;
|
||||||
|
priv->alpha_blend_op = VK_BLEND_OP_ADD;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1182,6 +1224,108 @@ error:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vulkan_full_screen_quad_enable_blend:
|
||||||
|
* @self: the #GstVulkanFullScreenQuad
|
||||||
|
* @enable_blend: whether to enable blending
|
||||||
|
*
|
||||||
|
* Enables blending of the input image to the output image.
|
||||||
|
*
|
||||||
|
* See also: gst_vulkan_full_screen_quad_set_blend_operation() and
|
||||||
|
* gst_vulkan_full_screen_quad_set_blend_factors().
|
||||||
|
*
|
||||||
|
* Since: 1.22
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_vulkan_full_screen_quad_enable_blend (GstVulkanFullScreenQuad * self,
|
||||||
|
gboolean enable_blend)
|
||||||
|
{
|
||||||
|
GstVulkanFullScreenQuadPrivate *priv;
|
||||||
|
|
||||||
|
g_return_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self));
|
||||||
|
|
||||||
|
priv = GET_PRIV (self);
|
||||||
|
|
||||||
|
if (priv->blend_enable == VK_TRUE && enable_blend)
|
||||||
|
return;
|
||||||
|
if (priv->blend_enable == VK_FALSE && !enable_blend)
|
||||||
|
return;
|
||||||
|
priv->blend_enable = enable_blend ? VK_TRUE : VK_FALSE;
|
||||||
|
|
||||||
|
clear_graphics_pipeline (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vulkan_full_screen_quad_set_blend_factors:
|
||||||
|
* @self: the #GstVulkanFullScreenQuad
|
||||||
|
* @src_blend_factor: the `VkBlendFactor` for the source image for the colour
|
||||||
|
* components (RGB)
|
||||||
|
* @src_alpha_blend_factor: the `VkBlendFactor` for the source image for the
|
||||||
|
* alpha component.
|
||||||
|
* @dst_blend_factor: the `VkBlendFactor` for the destination image for the
|
||||||
|
* colour components (RGB)
|
||||||
|
* @dst_alpha_blend_factor: the `VkBlendFactor` for the destination image for
|
||||||
|
* the alpha component.
|
||||||
|
*
|
||||||
|
* You need to enable blend with gst_vulkan_full_screen_quad_enable_blend().
|
||||||
|
*
|
||||||
|
* See also: gst_vulkan_full_screen_quad_set_blend_operation().
|
||||||
|
*
|
||||||
|
* Since: 1.22
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_vulkan_full_screen_quad_set_blend_factors (GstVulkanFullScreenQuad * self,
|
||||||
|
VkBlendFactor src_blend_factor, VkBlendFactor dst_blend_factor,
|
||||||
|
VkBlendFactor src_alpha_blend_factor, VkBlendFactor dst_alpha_blend_factor)
|
||||||
|
{
|
||||||
|
GstVulkanFullScreenQuadPrivate *priv;
|
||||||
|
|
||||||
|
g_return_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self));
|
||||||
|
|
||||||
|
priv = GET_PRIV (self);
|
||||||
|
|
||||||
|
if (priv->src_blend_factor == src_blend_factor
|
||||||
|
&& priv->src_alpha_blend_factor == src_alpha_blend_factor
|
||||||
|
&& priv->dst_blend_factor == dst_blend_factor
|
||||||
|
&& priv->dst_alpha_blend_factor == dst_alpha_blend_factor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->src_blend_factor = src_blend_factor;
|
||||||
|
priv->src_alpha_blend_factor = src_alpha_blend_factor;
|
||||||
|
priv->dst_blend_factor = dst_blend_factor;
|
||||||
|
priv->dst_alpha_blend_factor = dst_alpha_blend_factor;
|
||||||
|
|
||||||
|
clear_graphics_pipeline (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vulkan_full_screen_quad_set_blend_operation:
|
||||||
|
* @self: the #GstVulkanFullScreenQuad
|
||||||
|
* @colour_blend_op: the `VkBlendOp` to use for blending colour (RGB) values
|
||||||
|
* @alpha_blend_op: the `VkBlendOp` to use for blending alpha values
|
||||||
|
*
|
||||||
|
* You need to enable blend with gst_vulkan_full_screen_quad_enable_blend().
|
||||||
|
*
|
||||||
|
* See also: gst_vulkan_full_screen_quad_set_blend_factors().
|
||||||
|
*
|
||||||
|
* Since: 1.22
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_vulkan_full_screen_quad_set_blend_operation (GstVulkanFullScreenQuad * self,
|
||||||
|
VkBlendOp colour_blend_op, VkBlendOp alpha_blend_op)
|
||||||
|
{
|
||||||
|
GstVulkanFullScreenQuadPrivate *priv;
|
||||||
|
|
||||||
|
g_return_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self));
|
||||||
|
|
||||||
|
priv = GET_PRIV (self);
|
||||||
|
|
||||||
|
priv->colour_blend_op = colour_blend_op;
|
||||||
|
priv->alpha_blend_op = alpha_blend_op;
|
||||||
|
|
||||||
|
clear_graphics_pipeline (self);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_vulkan_full_screen_quad_prepare_draw:
|
* gst_vulkan_full_screen_quad_prepare_draw:
|
||||||
* @self: the #GstVulkanFullScreenQuad
|
* @self: the #GstVulkanFullScreenQuad
|
||||||
|
|
|
@ -119,6 +119,19 @@ GST_VULKAN_API
|
||||||
gboolean gst_vulkan_full_screen_quad_set_input_buffer (GstVulkanFullScreenQuad * self, GstBuffer * buffer, GError ** error);
|
gboolean gst_vulkan_full_screen_quad_set_input_buffer (GstVulkanFullScreenQuad * self, GstBuffer * buffer, GError ** error);
|
||||||
GST_VULKAN_API
|
GST_VULKAN_API
|
||||||
gboolean gst_vulkan_full_screen_quad_set_output_buffer (GstVulkanFullScreenQuad * self, GstBuffer * buffer, GError ** error);
|
gboolean gst_vulkan_full_screen_quad_set_output_buffer (GstVulkanFullScreenQuad * self, GstBuffer * buffer, GError ** error);
|
||||||
|
GST_VULKAN_API
|
||||||
|
void gst_vulkan_full_screen_quad_enable_blend (GstVulkanFullScreenQuad * self,
|
||||||
|
gboolean enable_blend);
|
||||||
|
GST_VULKAN_API
|
||||||
|
void gst_vulkan_full_screen_quad_set_blend_operation (GstVulkanFullScreenQuad * self,
|
||||||
|
VkBlendOp colour_blend_op,
|
||||||
|
VkBlendOp alpha_blend_op);
|
||||||
|
GST_VULKAN_API
|
||||||
|
void gst_vulkan_full_screen_quad_set_blend_factors (GstVulkanFullScreenQuad * self,
|
||||||
|
VkBlendFactor src_blend_factor,
|
||||||
|
VkBlendFactor dst_blend_factor,
|
||||||
|
VkBlendFactor src_alpha_blend_factor,
|
||||||
|
VkBlendFactor dst_alpha_blend_factor);
|
||||||
|
|
||||||
GST_VULKAN_API
|
GST_VULKAN_API
|
||||||
gboolean gst_vulkan_full_screen_quad_prepare_draw (GstVulkanFullScreenQuad * self, GstVulkanFence * fence, GError ** error);
|
gboolean gst_vulkan_full_screen_quad_prepare_draw (GstVulkanFullScreenQuad * self, GstVulkanFence * fence, GError ** error);
|
||||||
|
|
Loading…
Reference in a new issue