SpiecsEngine
 
Loading...
Searching...
No Matches

◆ CopyImageTexelToBuffer()

void Spices::VulkanImage::CopyImageTexelToBuffer ( uint32_t x,
uint32_t y,
void * out_rgba )

@breif Copy one texel data from a VkImage.

Parameters
[in]xThe sampled position x.
[in]yThe sampled position y.
[in]out_rgbaThe sampled data.
Todo
Support all type;

The temp buffer image date copy to.

Instance a VkBufferImageCopy.

Use Custom Cmd.

Write data to stagingbuffer.

Todo
Support all type;

The temp buffer image date copy to.

Instance a VkBufferImageCopy.

Use Custom Cmd.

Write data to stagingbuffer.

Definition at line 436 of file VulkanImage.cpp.

437 {
439
440 uint32_t channelize = 4;
441
445 switch (m_Format)
446 {
447 case VK_FORMAT_B8G8R8A8_UNORM: // 4 bytes.
448 channelize = 4;
449 break;
450 case VK_FORMAT_R32_SFLOAT: // 4 bytes.
451 channelize = 4;
452 break;
453 case VK_FORMAT_R32G32B32A32_SFLOAT: // 16 bytes.
454 channelize = 16;
455 break;
456 default:
457 break;
458 }
459
463 VulkanBuffer stagingBuffer(
465 "StagingBuffer",
466 channelize,
467 VK_BUFFER_USAGE_TRANSFER_DST_BIT,
468 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
469 );
470
471 /*
472 * @brief Transfer image layout from whatever to transfer src.
473 */
475 m_Format,
476 VK_IMAGE_LAYOUT_UNDEFINED,
477 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
478 );
479
483 VkBufferImageCopy region{};
484 region.bufferOffset = 0;
485 region.bufferRowLength = 0;
486 region.bufferImageHeight = 0;
487
488 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
489 region.imageSubresource.mipLevel = 0;
490 region.imageSubresource.baseArrayLayer = 0;
491 region.imageSubresource.layerCount = m_Layers;
492
493 region.imageOffset.x = static_cast<int32_t>(x);
494 region.imageOffset.y = static_cast<int32_t>(y);
495 region.imageExtent = { 1, 1, 1 };
496
500 VulkanCommandBuffer::CustomGraphicCmd(m_VulkanState, [&](const VkCommandBuffer& commandBuffer) {
501 vkCmdCopyImageToBuffer(commandBuffer, m_Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, stagingBuffer.Get(), 1, &region);
502 });
503
504 /*
505 * @brief Transfer image layout from transfer src to shader read.
506 * means only can get data from a shader read layout image.
507 * @note In SpicesEngine, we need transform layout to shader read in scene compose renderer first,
508 * and after that, you can do this here.
509 */
511 m_Format,
512 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
513 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
514 );
515
519 stagingBuffer.WriteFromBuffer(out_rgba);
520 }
#define SPICES_PROFILE_ZONE
static void CustomGraphicCmd(VulkanState &vulkanState, T func)
Create a new command buffer and record custom cmd, submit to graphic queue, execute it immediately.
VkFormat m_Format
The image format.
void TransitionImageLayout(VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout)
VkImage m_Image
The VkImage this Class Wrapped.
uint32_t m_Layers
Image layer(texture cube: 6).
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.

References Spices::VulkanObject::m_VulkanState.