mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 10:54:16 +01:00
[dxvk] Added image init functions to context
This commit is contained in:
parent
802fbe3cfd
commit
57821db900
@ -33,6 +33,29 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxvkBarrierSet::initImage(
|
||||
const Rc<DxvkImage>& image,
|
||||
const VkImageSubresourceRange& subresources,
|
||||
VkImageLayout dstLayout,
|
||||
VkPipelineStageFlags dstStages,
|
||||
VkAccessFlags dstAccess) {
|
||||
m_dstStages |= dstStages;
|
||||
|
||||
VkImageMemoryBarrier barrier;
|
||||
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||
barrier.pNext = nullptr;
|
||||
barrier.srcAccessMask = 0;
|
||||
barrier.dstAccessMask = dstAccess;
|
||||
barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
barrier.newLayout = dstLayout;
|
||||
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
barrier.image = image->handle();
|
||||
barrier.subresourceRange = subresources;
|
||||
m_imgBarriers.push_back(barrier);
|
||||
}
|
||||
|
||||
|
||||
void DxvkBarrierSet::recordCommands(const Rc<DxvkCommandList>& commandList) {
|
||||
if ((m_srcStages | m_dstStages) != 0) {
|
||||
VkPipelineStageFlags srcFlags = m_srcStages;
|
||||
|
@ -27,6 +27,13 @@ namespace dxvk {
|
||||
VkPipelineStageFlags stages,
|
||||
VkAccessFlags access);
|
||||
|
||||
void initImage(
|
||||
const Rc<DxvkImage>& image,
|
||||
const VkImageSubresourceRange& subresources,
|
||||
VkImageLayout dstLayout,
|
||||
VkPipelineStageFlags dstStages,
|
||||
VkAccessFlags dstAccess);
|
||||
|
||||
void recordCommands(
|
||||
const Rc<DxvkCommandList>& commandList);
|
||||
|
||||
|
@ -203,6 +203,35 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::initBuffer(
|
||||
const Rc<DxvkBuffer>& buffer,
|
||||
const Rc<DxvkDataBuffer>& data) {
|
||||
// TODO implement
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::initImage(
|
||||
const Rc<DxvkImage>& image,
|
||||
const Rc<DxvkDataBuffer>& data) {
|
||||
const DxvkImageCreateInfo& info = image->info();
|
||||
|
||||
VkImageSubresourceRange sr;
|
||||
sr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
sr.baseMipLevel = 0;
|
||||
sr.levelCount = info.mipLevels;
|
||||
sr.baseArrayLayer = 0;
|
||||
sr.levelCount = info.numLayers;
|
||||
|
||||
m_barriers.initImage(image, sr,
|
||||
VK_IMAGE_LAYOUT_GENERAL,
|
||||
info.stages,
|
||||
info.access);
|
||||
m_barriers.recordCommands(m_cmd);
|
||||
|
||||
// TODO implement data upload
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::setViewports(
|
||||
uint32_t viewportCount,
|
||||
const VkViewport* viewports,
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "dxvk_barrier.h"
|
||||
#include "dxvk_cmdlist.h"
|
||||
#include "dxvk_context_state.h"
|
||||
#include "dxvk_data.h"
|
||||
#include "dxvk_pipemgr.h"
|
||||
#include "dxvk_util.h"
|
||||
|
||||
@ -166,6 +167,33 @@ namespace dxvk {
|
||||
uint32_t vertexOffset,
|
||||
uint32_t firstInstance);
|
||||
|
||||
/**
|
||||
* \brief Initializes a buffer
|
||||
*
|
||||
* Uploads initial data to the buffer so that it
|
||||
* can be used for read-only operations. Unlike
|
||||
* \ref initImage, calling this is optional.
|
||||
* \param [in] buffer The buffer to initialize
|
||||
* \param [in] data Initial data buffer
|
||||
*/
|
||||
void initBuffer(
|
||||
const Rc<DxvkBuffer>& buffer,
|
||||
const Rc<DxvkDataBuffer>& data);
|
||||
|
||||
/**
|
||||
* \brief Initializes an image
|
||||
*
|
||||
* Sets up the image layout for future operations
|
||||
* and uploads data to the image. Note that this
|
||||
* method \e must be executed on the GPU before
|
||||
* the image can be used for any other operations.
|
||||
* \param [in] image The image to initialize
|
||||
* \param [in] data Initial data. Can be omitted.
|
||||
*/
|
||||
void initImage(
|
||||
const Rc<DxvkImage>& image,
|
||||
const Rc<DxvkDataBuffer>& data);
|
||||
|
||||
/**
|
||||
* \brief Sets viewports
|
||||
*
|
||||
|
17
src/dxvk/dxvk_data.cpp
Normal file
17
src/dxvk/dxvk_data.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include <cstring>
|
||||
|
||||
#include "dxvk_data.h"
|
||||
|
||||
namespace dxvk {
|
||||
|
||||
DxvkDataBuffer:: DxvkDataBuffer() { }
|
||||
DxvkDataBuffer::~DxvkDataBuffer() { }
|
||||
|
||||
DxvkDataBuffer::DxvkDataBuffer(
|
||||
const void* data,
|
||||
size_t size) {
|
||||
m_data.resize(size);
|
||||
std::memcpy(m_data.data(), data, size);
|
||||
}
|
||||
|
||||
}
|
42
src/dxvk/dxvk_data.h
Normal file
42
src/dxvk/dxvk_data.h
Normal file
@ -0,0 +1,42 @@
|
||||
#pragma once
|
||||
|
||||
#include "dxvk_include.h"
|
||||
|
||||
namespace dxvk {
|
||||
|
||||
/**
|
||||
* \brief Data buffer
|
||||
*
|
||||
* Stores immutable data. Used for temporary
|
||||
* copies of data that can be transferred to
|
||||
* or from DXVK resources.
|
||||
*/
|
||||
class DxvkDataBuffer : public RcObject {
|
||||
|
||||
public:
|
||||
|
||||
DxvkDataBuffer();
|
||||
DxvkDataBuffer(
|
||||
const void* data,
|
||||
size_t size);
|
||||
~DxvkDataBuffer();
|
||||
|
||||
size_t size() const {
|
||||
return m_data.size();
|
||||
}
|
||||
|
||||
void* data() {
|
||||
return m_data.data();
|
||||
}
|
||||
|
||||
const void* data() const {
|
||||
return m_data.data();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
std::vector<char> m_data;
|
||||
|
||||
};
|
||||
|
||||
}
|
@ -6,6 +6,7 @@ dxvk_src = files([
|
||||
'dxvk_compute.cpp',
|
||||
'dxvk_constant_state.cpp',
|
||||
'dxvk_context.cpp',
|
||||
'dxvk_data.cpp',
|
||||
'dxvk_descriptor.cpp',
|
||||
'dxvk_device.cpp',
|
||||
'dxvk_framebuffer.cpp',
|
||||
|
Loading…
x
Reference in New Issue
Block a user