summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Faye-Lund <[email protected]>2019-11-06 15:36:43 +0100
committerErik Faye-Lund <[email protected]>2019-11-13 09:14:05 +0100
commit589e8651e63d8b9b2ef144258de52c7f2cb9f6da (patch)
tree88561b5f1094787a6f4ab697b237cdf141cd1217
parent1605a0c8f20b7e7a32fc52c7f082c79e0ad5cb38 (diff)
zink: move blitting to separate source
This code is kinda stand-alone, and it makes it a bit easier to find the right source in the source-tree
-rw-r--r--src/gallium/drivers/zink/meson.build1
-rw-r--r--src/gallium/drivers/zink/zink_blit.c183
-rw-r--r--src/gallium/drivers/zink/zink_context.c176
-rw-r--r--src/gallium/drivers/zink/zink_context.h4
4 files changed, 188 insertions, 176 deletions
diff --git a/src/gallium/drivers/zink/meson.build b/src/gallium/drivers/zink/meson.build
index 7a4ad560699..634d01e27b2 100644
--- a/src/gallium/drivers/zink/meson.build
+++ b/src/gallium/drivers/zink/meson.build
@@ -22,6 +22,7 @@ files_libzink = files(
'nir_to_spirv/nir_to_spirv.c',
'nir_to_spirv/spirv_builder.c',
'zink_batch.c',
+ 'zink_blit.c',
'zink_compiler.c',
'zink_context.c',
'zink_fence.c',
diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c
new file mode 100644
index 00000000000..9319630761c
--- /dev/null
+++ b/src/gallium/drivers/zink/zink_blit.c
@@ -0,0 +1,183 @@
+#include "zink_context.h"
+#include "zink_helpers.h"
+#include "zink_resource.h"
+#include "zink_screen.h"
+
+#include "util/u_blitter.h"
+#include "util/u_format.h"
+
+static bool
+blit_resolve(struct zink_context *ctx, const struct pipe_blit_info *info)
+{
+ if (info->mask != PIPE_MASK_RGBA ||
+ info->scissor_enable ||
+ info->alpha_blend)
+ return false;
+
+ struct zink_resource *src = zink_resource(info->src.resource);
+ struct zink_resource *dst = zink_resource(info->dst.resource);
+
+ struct zink_screen *screen = zink_screen(ctx->base.screen);
+ if (src->format != zink_get_format(screen, info->src.format) ||
+ dst->format != zink_get_format(screen, info->dst.format))
+ return false;
+
+ struct zink_batch *batch = zink_batch_no_rp(ctx);
+
+ zink_batch_reference_resoure(batch, src);
+ zink_batch_reference_resoure(batch, dst);
+
+ if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
+ zink_resource_barrier(batch->cmdbuf, src, src->aspect,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+
+ if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
+ zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+
+ VkImageResolve region = {};
+
+ region.srcSubresource.aspectMask = src->aspect;
+ region.srcSubresource.mipLevel = info->src.level;
+ region.srcSubresource.baseArrayLayer = 0; // no clue
+ region.srcSubresource.layerCount = 1; // no clue
+ region.srcOffset.x = info->src.box.x;
+ region.srcOffset.y = info->src.box.y;
+ region.srcOffset.z = info->src.box.z;
+
+ region.dstSubresource.aspectMask = dst->aspect;
+ region.dstSubresource.mipLevel = info->dst.level;
+ region.dstSubresource.baseArrayLayer = 0; // no clue
+ region.dstSubresource.layerCount = 1; // no clue
+ region.dstOffset.x = info->dst.box.x;
+ region.dstOffset.y = info->dst.box.y;
+ region.dstOffset.z = info->dst.box.z;
+
+ region.extent.width = info->dst.box.width;
+ region.extent.height = info->dst.box.height;
+ region.extent.depth = info->dst.box.depth;
+ vkCmdResolveImage(batch->cmdbuf, src->image, src->layout,
+ dst->image, dst->layout,
+ 1, &region);
+
+ return true;
+}
+
+static bool
+blit_native(struct zink_context *ctx, const struct pipe_blit_info *info)
+{
+ if (info->mask != PIPE_MASK_RGBA ||
+ info->scissor_enable ||
+ info->alpha_blend)
+ return false;
+
+ struct zink_resource *src = zink_resource(info->src.resource);
+ struct zink_resource *dst = zink_resource(info->dst.resource);
+
+ struct zink_screen *screen = zink_screen(ctx->base.screen);
+ if (src->format != zink_get_format(screen, info->src.format) ||
+ dst->format != zink_get_format(screen, info->dst.format))
+ return false;
+
+ struct zink_batch *batch = zink_batch_no_rp(ctx);
+ zink_batch_reference_resoure(batch, src);
+ zink_batch_reference_resoure(batch, dst);
+
+ if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
+ zink_resource_barrier(batch->cmdbuf, src, src->aspect,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+
+ if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
+ zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+
+ VkImageBlit region = {};
+ region.srcSubresource.aspectMask = src->aspect;
+ region.srcSubresource.mipLevel = info->src.level;
+ region.srcOffsets[0].x = info->src.box.x;
+ region.srcOffsets[0].y = info->src.box.y;
+ region.srcOffsets[1].x = info->src.box.x + info->src.box.width;
+ region.srcOffsets[1].y = info->src.box.y + info->src.box.height;
+
+ if (src->base.array_size > 1) {
+ region.srcOffsets[0].z = 0;
+ region.srcOffsets[1].z = 1;
+ region.srcSubresource.baseArrayLayer = info->src.box.z;
+ region.srcSubresource.layerCount = info->src.box.depth;
+ } else {
+ region.srcOffsets[0].z = info->src.box.z;
+ region.srcOffsets[1].z = info->src.box.z + info->src.box.depth;
+ region.srcSubresource.baseArrayLayer = 0;
+ region.srcSubresource.layerCount = 1;
+ }
+
+ region.dstSubresource.aspectMask = dst->aspect;
+ region.dstSubresource.mipLevel = info->dst.level;
+ region.dstOffsets[0].x = info->dst.box.x;
+ region.dstOffsets[0].y = info->dst.box.y;
+ region.dstOffsets[1].x = info->dst.box.x + info->dst.box.width;
+ region.dstOffsets[1].y = info->dst.box.y + info->dst.box.height;
+
+ if (dst->base.array_size > 1) {
+ region.dstOffsets[0].z = 0;
+ region.dstOffsets[1].z = 1;
+ region.dstSubresource.baseArrayLayer = info->dst.box.z;
+ region.dstSubresource.layerCount = info->dst.box.depth;
+ } else {
+ region.dstOffsets[0].z = info->dst.box.z;
+ region.dstOffsets[1].z = info->dst.box.z + info->dst.box.depth;
+ region.dstSubresource.baseArrayLayer = 0;
+ region.dstSubresource.layerCount = 1;
+ }
+
+ vkCmdBlitImage(batch->cmdbuf, src->image, src->layout,
+ dst->image, dst->layout,
+ 1, &region,
+ zink_filter(info->filter));
+
+ return true;
+}
+
+void
+zink_blit(struct pipe_context *pctx,
+ const struct pipe_blit_info *info)
+{
+ struct zink_context *ctx = zink_context(pctx);
+ if (info->src.resource->nr_samples > 1 &&
+ info->dst.resource->nr_samples <= 1) {
+ if (blit_resolve(ctx, info))
+ return;
+ } else {
+ if (blit_native(ctx, info))
+ return;
+ }
+
+ if (!util_blitter_is_blit_supported(ctx->blitter, info)) {
+ debug_printf("blit unsupported %s -> %s\n",
+ util_format_short_name(info->src.resource->format),
+ util_format_short_name(info->dst.resource->format));
+ return;
+ }
+
+ util_blitter_save_blend(ctx->blitter, ctx->gfx_pipeline_state.blend_state);
+ util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->gfx_pipeline_state.depth_stencil_alpha_state);
+ util_blitter_save_vertex_elements(ctx->blitter, ctx->element_state);
+ util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref);
+ util_blitter_save_rasterizer(ctx->blitter, ctx->rast_state);
+ util_blitter_save_fragment_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_FRAGMENT]);
+ util_blitter_save_vertex_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_VERTEX]);
+ util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state);
+ util_blitter_save_viewport(ctx->blitter, ctx->viewport_states);
+ util_blitter_save_scissor(ctx->blitter, ctx->scissor_states);
+ util_blitter_save_fragment_sampler_states(ctx->blitter,
+ ctx->num_samplers[PIPE_SHADER_FRAGMENT],
+ (void **)ctx->samplers[PIPE_SHADER_FRAGMENT]);
+ util_blitter_save_fragment_sampler_views(ctx->blitter,
+ ctx->num_image_views[PIPE_SHADER_FRAGMENT],
+ ctx->image_views[PIPE_SHADER_FRAGMENT]);
+ util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->ubos[PIPE_SHADER_FRAGMENT]);
+ util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->buffers);
+ util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask);
+
+ util_blitter_blit(ctx->blitter, info);
+}
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index f472127add3..0429c8553bc 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1248,182 +1248,6 @@ zink_flush(struct pipe_context *pctx,
PIPE_TIMEOUT_INFINITE);
}
-static bool
-blit_resolve(struct zink_context *ctx, const struct pipe_blit_info *info)
-{
- if (info->mask != PIPE_MASK_RGBA ||
- info->scissor_enable ||
- info->alpha_blend)
- return false;
-
- struct zink_resource *src = zink_resource(info->src.resource);
- struct zink_resource *dst = zink_resource(info->dst.resource);
-
- struct zink_screen *screen = zink_screen(ctx->base.screen);
- if (src->format != zink_get_format(screen, info->src.format) ||
- dst->format != zink_get_format(screen, info->dst.format))
- return false;
-
- struct zink_batch *batch = zink_batch_no_rp(ctx);
-
- zink_batch_reference_resoure(batch, src);
- zink_batch_reference_resoure(batch, dst);
-
- if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, src, src->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
-
- if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-
- VkImageResolve region = {};
-
- region.srcSubresource.aspectMask = src->aspect;
- region.srcSubresource.mipLevel = info->src.level;
- region.srcSubresource.baseArrayLayer = 0; // no clue
- region.srcSubresource.layerCount = 1; // no clue
- region.srcOffset.x = info->src.box.x;
- region.srcOffset.y = info->src.box.y;
- region.srcOffset.z = info->src.box.z;
-
- region.dstSubresource.aspectMask = dst->aspect;
- region.dstSubresource.mipLevel = info->dst.level;
- region.dstSubresource.baseArrayLayer = 0; // no clue
- region.dstSubresource.layerCount = 1; // no clue
- region.dstOffset.x = info->dst.box.x;
- region.dstOffset.y = info->dst.box.y;
- region.dstOffset.z = info->dst.box.z;
-
- region.extent.width = info->dst.box.width;
- region.extent.height = info->dst.box.height;
- region.extent.depth = info->dst.box.depth;
- vkCmdResolveImage(batch->cmdbuf, src->image, src->layout,
- dst->image, dst->layout,
- 1, &region);
-
- return true;
-}
-
-static bool
-blit_native(struct zink_context *ctx, const struct pipe_blit_info *info)
-{
- if (info->mask != PIPE_MASK_RGBA ||
- info->scissor_enable ||
- info->alpha_blend)
- return false;
-
- struct zink_resource *src = zink_resource(info->src.resource);
- struct zink_resource *dst = zink_resource(info->dst.resource);
-
- struct zink_screen *screen = zink_screen(ctx->base.screen);
- if (src->format != zink_get_format(screen, info->src.format) ||
- dst->format != zink_get_format(screen, info->dst.format))
- return false;
-
- struct zink_batch *batch = zink_batch_no_rp(ctx);
- zink_batch_reference_resoure(batch, src);
- zink_batch_reference_resoure(batch, dst);
-
- if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, src, src->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
-
- if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-
- VkImageBlit region = {};
- region.srcSubresource.aspectMask = src->aspect;
- region.srcSubresource.mipLevel = info->src.level;
- region.srcOffsets[0].x = info->src.box.x;
- region.srcOffsets[0].y = info->src.box.y;
- region.srcOffsets[1].x = info->src.box.x + info->src.box.width;
- region.srcOffsets[1].y = info->src.box.y + info->src.box.height;
-
- if (src->base.array_size > 1) {
- region.srcOffsets[0].z = 0;
- region.srcOffsets[1].z = 1;
- region.srcSubresource.baseArrayLayer = info->src.box.z;
- region.srcSubresource.layerCount = info->src.box.depth;
- } else {
- region.srcOffsets[0].z = info->src.box.z;
- region.srcOffsets[1].z = info->src.box.z + info->src.box.depth;
- region.srcSubresource.baseArrayLayer = 0;
- region.srcSubresource.layerCount = 1;
- }
-
- region.dstSubresource.aspectMask = dst->aspect;
- region.dstSubresource.mipLevel = info->dst.level;
- region.dstOffsets[0].x = info->dst.box.x;
- region.dstOffsets[0].y = info->dst.box.y;
- region.dstOffsets[1].x = info->dst.box.x + info->dst.box.width;
- region.dstOffsets[1].y = info->dst.box.y + info->dst.box.height;
-
- if (dst->base.array_size > 1) {
- region.dstOffsets[0].z = 0;
- region.dstOffsets[1].z = 1;
- region.dstSubresource.baseArrayLayer = info->dst.box.z;
- region.dstSubresource.layerCount = info->dst.box.depth;
- } else {
- region.dstOffsets[0].z = info->dst.box.z;
- region.dstOffsets[1].z = info->dst.box.z + info->dst.box.depth;
- region.dstSubresource.baseArrayLayer = 0;
- region.dstSubresource.layerCount = 1;
- }
-
- vkCmdBlitImage(batch->cmdbuf, src->image, src->layout,
- dst->image, dst->layout,
- 1, &region,
- zink_filter(info->filter));
-
- return true;
-}
-
-static void
-zink_blit(struct pipe_context *pctx,
- const struct pipe_blit_info *info)
-{
- struct zink_context *ctx = zink_context(pctx);
- if (info->src.resource->nr_samples > 1 &&
- info->dst.resource->nr_samples <= 1) {
- if (blit_resolve(ctx, info))
- return;
- } else {
- if (blit_native(ctx, info))
- return;
- }
-
- if (!util_blitter_is_blit_supported(ctx->blitter, info)) {
- debug_printf("blit unsupported %s -> %s\n",
- util_format_short_name(info->src.resource->format),
- util_format_short_name(info->dst.resource->format));
- return;
- }
-
- util_blitter_save_blend(ctx->blitter, ctx->gfx_pipeline_state.blend_state);
- util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->gfx_pipeline_state.depth_stencil_alpha_state);
- util_blitter_save_vertex_elements(ctx->blitter, ctx->element_state);
- util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref);
- util_blitter_save_rasterizer(ctx->blitter, ctx->rast_state);
- util_blitter_save_fragment_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_FRAGMENT]);
- util_blitter_save_vertex_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_VERTEX]);
- util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state);
- util_blitter_save_viewport(ctx->blitter, ctx->viewport_states);
- util_blitter_save_scissor(ctx->blitter, ctx->scissor_states);
- util_blitter_save_fragment_sampler_states(ctx->blitter,
- ctx->num_samplers[PIPE_SHADER_FRAGMENT],
- (void **)ctx->samplers[PIPE_SHADER_FRAGMENT]);
- util_blitter_save_fragment_sampler_views(ctx->blitter,
- ctx->num_image_views[PIPE_SHADER_FRAGMENT],
- ctx->image_views[PIPE_SHADER_FRAGMENT]);
- util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->ubos[PIPE_SHADER_FRAGMENT]);
- util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->buffers);
- util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask);
-
- util_blitter_blit(ctx->blitter, info);
-}
-
static void
zink_flush_resource(struct pipe_context *pipe,
struct pipe_resource *resource)
diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index 35c4ec22e83..c1e2843ce8c 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -148,4 +148,8 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags);
void
zink_context_query_init(struct pipe_context *ctx);
+void
+zink_blit(struct pipe_context *pctx,
+ const struct pipe_blit_info *info);
+
#endif