VulkanShader_1.21.10-0.0.4-alpha.jar
Download file
package net.vulkanmod.vulkan.texture;
import java.nio.LongBuffer;
import net.vulkanmod.vulkan.Renderer;
import net.vulkanmod.vulkan.device.DeviceManager;
import net.vulkanmod.vulkan.memory.MemoryManager;
import net.vulkanmod.vulkan.memory.buffer.Buffer;
import net.vulkanmod.vulkan.queue.CommandPool;
import net.vulkanmod.vulkan.util.VUtil;
import org.lwjgl.PointerBuffer;
import org.lwjgl.system.MemoryStack;
import org.lwjgl.vulkan.VK10;
import org.lwjgl.vulkan.VkBufferImageCopy;
import org.lwjgl.vulkan.VkBufferMemoryBarrier;
import org.lwjgl.vulkan.VkCommandBuffer;
import org.lwjgl.vulkan.VkExtent3D;
import org.lwjgl.vulkan.VkImageBlit;
import org.lwjgl.vulkan.VkImageMemoryBarrier;
import org.lwjgl.vulkan.VkMemoryBarrier;
import org.lwjgl.vulkan.VkOffset3D;
public abstract class ImageUtil {
public static void copyBufferToImageCmd(MemoryStack stack, VkCommandBuffer commandBuffer, long buffer, long image, int arrayLayer, int mipLevel, int width, int height, int xOffset, int yOffset, int bufferOffset, int bufferRowLenght, int bufferImageHeight) {
VkBufferImageCopy.Buffer region = VkBufferImageCopy.calloc(1, stack);
region.bufferOffset((long)bufferOffset);
region.bufferRowLength(bufferRowLenght);
region.bufferImageHeight(bufferImageHeight);
region.imageSubresource().aspectMask(1);
region.imageSubresource().mipLevel(mipLevel);
region.imageSubresource().baseArrayLayer(arrayLayer);
region.imageSubresource().layerCount(1);
region.imageOffset().set(xOffset, yOffset, 0);
region.imageExtent(VkExtent3D.calloc(stack).set(width, height, 1));
VK10.vkCmdCopyBufferToImage(commandBuffer, buffer, image, 7, region);
}
public static void downloadTexture(VulkanImage image, long ptr) {
MemoryStack stack = MemoryStack.stackPush();
try {
int prevLayout = image.getCurrentLayout();
CommandPool.CommandBuffer commandBuffer = DeviceManager.getGraphicsQueue().beginCommands();
image.transitionImageLayout(stack, commandBuffer.getHandle(), 6);
long imageSize = (long)image.width * (long)image.height * (long)image.formatSize;
LongBuffer pStagingBuffer = stack.mallocLong(1);
PointerBuffer pStagingAllocation = stack.pointers(0L);
MemoryManager.getInstance().createBuffer(imageSize, 2, 6, pStagingBuffer, pStagingAllocation);
copyImageToBufferCmd(stack, commandBuffer.getHandle(), pStagingBuffer.get(0), image.getId(), 0, image.width, image.height, 0, 0, 0, 0, 0);
image.transitionImageLayout(stack, commandBuffer.getHandle(), prevLayout);
long fence = DeviceManager.getGraphicsQueue().submitCommands(commandBuffer);
VK10.vkWaitForFences(DeviceManager.vkDevice, fence, true, -1L);
MemoryManager.MapAndCopy(pStagingAllocation.get(0), (data) -> VUtil.memcpy(data.getByteBuffer(0, (int)imageSize), ptr));
MemoryManager.freeBuffer(pStagingBuffer.get(0), pStagingAllocation.get(0));
} catch (Throwable var13) {
if (stack != null) {
try {
stack.close();
} catch (Throwable var12) {
var13.addSuppressed(var12);
}
}
throw var13;
}
if (stack != null) {
stack.close();
}
}
public static void copyImageToBuffer(VulkanImage image, Buffer buffer, int mipLevel, int width, int height, int xOffset, int yOffset, int bufferOffset, int bufferRowLength, int bufferImageHeight) {
MemoryStack stack = MemoryStack.stackPush();
try {
int prevLayout = image.getCurrentLayout();
CommandPool.CommandBuffer commandBuffer = DeviceManager.getGraphicsQueue().beginCommands();
image.transitionImageLayout(stack, commandBuffer.getHandle(), 6);
copyImageToBufferCmd(stack, commandBuffer.getHandle(), buffer.getId(), image.getId(), mipLevel, width, height, xOffset, yOffset, bufferOffset, bufferRowLength, bufferImageHeight);
image.transitionImageLayout(stack, commandBuffer.getHandle(), prevLayout);
long fence = DeviceManager.getGraphicsQueue().submitCommands(commandBuffer);
VK10.vkWaitForFences(DeviceManager.vkDevice, fence, true, -1L);
} catch (Throwable var16) {
if (stack != null) {
try {
stack.close();
} catch (Throwable var15) {
var16.addSuppressed(var15);
}
}
throw var16;
}
if (stack != null) {
stack.close();
}
}
public static void copyImageToBufferCmd(MemoryStack stack, VkCommandBuffer commandBuffer, long buffer, long image, int mipLevel, int width, int height, int xOffset, int yOffset, int bufferOffset, int bufferRowLength, int bufferImageHeight) {
VkBufferImageCopy.Buffer region = VkBufferImageCopy.calloc(1, stack);
region.bufferOffset((long)bufferOffset);
region.bufferRowLength(bufferRowLength);
region.bufferImageHeight(bufferImageHeight);
region.imageSubresource().aspectMask(1);
region.imageSubresource().mipLevel(mipLevel);
region.imageSubresource().baseArrayLayer(0);
region.imageSubresource().layerCount(1);
region.imageOffset().set(xOffset, yOffset, 0);
region.imageExtent().set(width, height, 1);
VK10.vkCmdCopyImageToBuffer(commandBuffer, image, 6, buffer, region);
}
public static void blitFramebuffer(VulkanImage dstImage, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1) {
MemoryStack stack = MemoryStack.stackPush();
try {
VkCommandBuffer commandBuffer = Renderer.getCommandBuffer();
Renderer.getInstance().endRenderPass(commandBuffer);
dstImage.transitionImageLayout(stack, commandBuffer, 7);
VulkanImage srcImage = Renderer.getInstance().getSwapChain().getColorAttachment();
srcImage.transitionImageLayout(stack, commandBuffer, 6);
VkImageBlit.Buffer blit = VkImageBlit.calloc(1, stack);
blit.srcOffsets(0, VkOffset3D.calloc(stack).set(0, 0, 0));
blit.srcOffsets(1, VkOffset3D.calloc(stack).set(srcImage.width, srcImage.height, 1));
blit.srcSubresource().aspectMask(1).mipLevel(0).baseArrayLayer(0).layerCount(1);
blit.dstOffsets(0, VkOffset3D.calloc(stack).set(0, 0, 0));
blit.dstOffsets(1, VkOffset3D.calloc(stack).set(dstImage.width, dstImage.height, 1));
blit.dstSubresource().aspectMask(1).mipLevel(0).baseArrayLayer(0).layerCount(1);
VK10.vkCmdBlitImage(commandBuffer, srcImage.getId(), 6, dstImage.getId(), 7, blit, 1);
dstImage.transitionImageLayout(stack, commandBuffer, 5);
Renderer.getInstance().getMainPass().rebindMainTarget();
} catch (Throwable var14) {
if (stack != null) {
try {
stack.close();
} catch (Throwable var13) {
var14.addSuppressed(var13);
}
}
throw var14;
}
if (stack != null) {
stack.close();
}
}
public static void generateMipmaps(VulkanImage image) {
MemoryStack stack = MemoryStack.stackPush();
try {
CommandPool.CommandBuffer commandBuffer = DeviceManager.getGraphicsQueue().beginCommands();
image.transitionImageLayout(stack, commandBuffer.getHandle(), 7);
for(int level = 1; level < image.mipLevels; ++level) {
int prevLevel = level - 1;
VkImageMemoryBarrier.Buffer barrier = VkImageMemoryBarrier.calloc(1, stack);
barrier.sType(45);
barrier.oldLayout(2);
barrier.newLayout(1);
barrier.srcQueueFamilyIndex(-1);
barrier.dstQueueFamilyIndex(-1);
barrier.image(image.getId());
barrier.subresourceRange().baseMipLevel(prevLevel);
barrier.subresourceRange().levelCount(1);
barrier.subresourceRange().baseArrayLayer(0);
barrier.subresourceRange().layerCount(-1);
barrier.subresourceRange().aspectMask(image.aspect);
barrier.srcAccessMask(4096);
barrier.dstAccessMask(2048);
VK10.vkCmdPipelineBarrier(commandBuffer.getHandle(), 4096, 4096, 0, (VkMemoryBarrier.Buffer)null, (VkBufferMemoryBarrier.Buffer)null, barrier);
prevLevel = level - 1;
VkImageBlit.Buffer blit = VkImageBlit.calloc(1, stack);
blit.srcOffsets(0, VkOffset3D.calloc(stack).set(0, 0, 0));
blit.srcOffsets(1, VkOffset3D.calloc(stack).set(image.width >> prevLevel, image.height >> prevLevel, 1));
blit.srcSubresource().aspectMask(1).mipLevel(prevLevel).baseArrayLayer(0).layerCount(1);
blit.dstOffsets(0, VkOffset3D.calloc(stack).set(0, 0, 0));
blit.dstOffsets(1, VkOffset3D.calloc(stack).set(image.width >> level, image.height >> level, 1));
blit.dstSubresource().aspectMask(1).mipLevel(level).baseArrayLayer(0).layerCount(1);
VK10.vkCmdBlitImage(commandBuffer.getHandle(), image.getId(), 6, image.getId(), 7, blit, 1);
}
VkImageMemoryBarrier.Buffer barrier = VkImageMemoryBarrier.calloc(1, stack);
barrier.sType(45);
barrier.oldLayout(1);
barrier.newLayout(5);
barrier.srcQueueFamilyIndex(-1);
barrier.dstQueueFamilyIndex(-1);
barrier.image(image.getId());
barrier.subresourceRange().baseMipLevel(0);
barrier.subresourceRange().levelCount(image.mipLevels - 1);
barrier.subresourceRange().baseArrayLayer(0);
barrier.subresourceRange().layerCount(-1);
barrier.subresourceRange().aspectMask(image.aspect);
barrier.srcAccessMask(4096);
barrier.dstAccessMask(32);
VK10.vkCmdPipelineBarrier(commandBuffer.getHandle(), 4096, 8192, 0, (VkMemoryBarrier.Buffer)null, (VkBufferMemoryBarrier.Buffer)null, barrier);
barrier.oldLayout(2);
barrier.subresourceRange().baseMipLevel(image.mipLevels - 1);
barrier.subresourceRange().levelCount(1);
VK10.vkCmdPipelineBarrier(commandBuffer.getHandle(), 4096, 8192, 0, (VkMemoryBarrier.Buffer)null, (VkBufferMemoryBarrier.Buffer)null, barrier);
image.setCurrentLayout(5);
long fence = DeviceManager.getGraphicsQueue().submitCommands(commandBuffer);
VK10.vkWaitForFences(DeviceManager.vkDevice, fence, true, -1L);
} catch (Throwable var9) {
if (stack != null) {
try {
stack.close();
} catch (Throwable var8) {
var9.addSuppressed(var8);
}
}
throw var9;
}
if (stack != null) {
stack.close();
}
}
}
Download file