Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
VkCV Framework
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Monitor
Service Desk
Analyze
Contributor analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Vulkan2021
VkCV Framework
Commits
59b78edb
Verified
Commit
59b78edb
authored
2 years ago
by
Tobias Frisch
Browse files
Options
Downloads
Patches
Plain Diff
Store image layouts for each layer separate
Signed-off-by:
Tobias Frisch
<
tfrisch@uni-koblenz.de
>
parent
5af2ba49
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/vkcv/ImageManager.cpp
+73
-34
73 additions, 34 deletions
src/vkcv/ImageManager.cpp
src/vkcv/ImageManager.hpp
+2
-3
2 additions, 3 deletions
src/vkcv/ImageManager.hpp
with
75 additions
and
37 deletions
src/vkcv/ImageManager.cpp
+
73
−
34
View file @
59b78edb
...
...
@@ -340,6 +340,9 @@ namespace vkcv {
arrayViews
.
push_back
(
device
.
createImageView
(
imageViewCreateInfo
));
}
std
::
vector
<
vk
::
ImageLayout
>
layers
;
layers
.
resize
(
arrayLayers
,
vk
::
ImageLayout
::
eUndefined
);
return
add
({
image
,
allocation
,
...
...
@@ -349,8 +352,7 @@ namespace vkcv {
config
.
getHeight
(),
config
.
getDepth
(),
format
,
arrayLayers
,
vk
::
ImageLayout
::
eUndefined
,
layers
,
config
.
isSupportingStorage
()
});
}
...
...
@@ -417,20 +419,22 @@ namespace vkcv {
mipLevelOffset
,
mipLevelCount
,
0
,
image
.
m_layers
static_cast
<
uint32_t
>
(
image
.
m_layers
.
size
())
);
// TODO: precise AccessFlagBits, will require a lot of context
return
vk
::
ImageMemoryBarrier
(
vk
::
ImageMemoryBarrier
barrier
(
vk
::
AccessFlagBits
::
eMemoryWrite
,
vk
::
AccessFlagBits
::
eMemoryRead
,
image
.
m_lay
out
,
image
.
m_lay
ers
[
0
]
,
newLayout
,
VK_QUEUE_FAMILY_IGNORED
,
VK_QUEUE_FAMILY_IGNORED
,
image
.
m_handle
,
imageSubresourceRange
);
return
barrier
;
}
void
ImageManager
::
switchImageLayoutImmediate
(
const
ImageHandle
&
handle
,
...
...
@@ -445,14 +449,23 @@ namespace vkcv {
stream
,
[
transitionBarrier
](
const
vk
::
CommandBuffer
&
commandBuffer
)
{
// TODO: precise PipelineStageFlagBits, will require a lot of context
commandBuffer
.
pipelineBarrier
(
vk
::
PipelineStageFlagBits
::
eTopOfPipe
,
vk
::
PipelineStageFlagBits
::
eBottomOfPipe
,
{},
nullptr
,
nullptr
,
transitionBarrier
);
commandBuffer
.
pipelineBarrier
(
vk
::
PipelineStageFlagBits
::
eTopOfPipe
,
vk
::
PipelineStageFlagBits
::
eBottomOfPipe
,
{},
nullptr
,
nullptr
,
transitionBarrier
);
},
nullptr
);
nullptr
);
core
.
submitCommandStream
(
stream
,
false
);
image
.
m_layout
=
newLayout
;
for
(
auto
&
layer
:
image
.
m_layers
)
{
layer
=
newLayout
;
}
}
void
ImageManager
::
recordImageLayoutTransition
(
const
ImageHandle
&
handle
,
...
...
@@ -460,25 +473,45 @@ namespace vkcv {
vk
::
ImageLayout
newLayout
,
vk
::
CommandBuffer
cmdBuffer
)
{
auto
&
image
=
(
*
this
)
[
handle
];
const
auto
transitionBarrier
=
createImageLayoutTransitionBarrier
(
image
,
mipLevelCount
,
mipLevelOffset
,
newLayout
);
const
auto
transitionBarrier
=
createImageLayoutTransitionBarrier
(
image
,
mipLevelCount
,
mipLevelOffset
,
newLayout
);
cmdBuffer
.
pipelineBarrier
(
vk
::
PipelineStageFlagBits
::
eAllCommands
,
vk
::
PipelineStageFlagBits
::
eAllCommands
,
{},
nullptr
,
nullptr
,
transitionBarrier
);
cmdBuffer
.
pipelineBarrier
(
vk
::
PipelineStageFlagBits
::
eAllCommands
,
vk
::
PipelineStageFlagBits
::
eAllCommands
,
{},
nullptr
,
nullptr
,
transitionBarrier
);
image
.
m_layout
=
newLayout
;
for
(
auto
&
layer
:
image
.
m_layers
)
{
layer
=
newLayout
;
}
}
void
ImageManager
::
recordImageMemoryBarrier
(
const
ImageHandle
&
handle
,
vk
::
CommandBuffer
cmdBuffer
)
{
auto
&
image
=
(
*
this
)
[
handle
];
const
auto
transitionBarrier
=
createImageLayoutTransitionBarrier
(
image
,
0
,
0
,
image
.
m_layout
);
const
auto
transitionBarrier
=
createImageLayoutTransitionBarrier
(
image
,
0
,
0
,
image
.
m_layers
[
0
]
);
cmdBuffer
.
pipelineBarrier
(
vk
::
PipelineStageFlagBits
::
eAllCommands
,
vk
::
PipelineStageFlagBits
::
eAllCommands
,
{},
nullptr
,
nullptr
,
transitionBarrier
);
cmdBuffer
.
pipelineBarrier
(
vk
::
PipelineStageFlagBits
::
eAllCommands
,
vk
::
PipelineStageFlagBits
::
eAllCommands
,
{},
nullptr
,
nullptr
,
transitionBarrier
);
}
constexpr
uint32_t
getBytesPerPixel
(
vk
::
Format
format
)
{
...
...
@@ -512,18 +545,20 @@ namespace vkcv {
}
auto
&
image
=
(
*
this
)
[
handle
];
const
uint32_t
baseArrayLayer
=
std
::
min
<
uint32_t
>
(
firstLayer
,
image
.
m_layers
);
if
(
baseArrayLayer
>=
image
.
m_layers
)
{
const
auto
imageLayerCount
=
static_cast
<
uint32_t
>
(
image
.
m_layers
.
size
());
const
uint32_t
baseArrayLayer
=
std
::
min
<
uint32_t
>
(
firstLayer
,
imageLayerCount
);
if
(
baseArrayLayer
>=
image
.
m_layers
.
size
())
{
return
;
}
uint32_t
arrayLayerCount
;
if
(
layerCount
>
0
)
{
arrayLayerCount
=
std
::
min
<
uint32_t
>
(
layerCount
,
image
.
m_layers
-
baseArrayLayer
);
arrayLayerCount
=
std
::
min
<
uint32_t
>
(
layerCount
,
image
LayerCount
-
baseArrayLayer
);
}
else
{
arrayLayerCount
=
image
.
m_layers
-
baseArrayLayer
;
arrayLayerCount
=
image
LayerCount
-
baseArrayLayer
;
}
switchImageLayoutImmediate
(
handle
,
vk
::
ImageLayout
::
eTransferDstOptimal
);
...
...
@@ -596,10 +631,13 @@ namespace vkcv {
auto
&
srcImage
=
(
*
this
)
[
src
];
auto
&
dstImage
=
(
*
this
)
[
dst
];
const
auto
srcLayerCount
=
static_cast
<
uint32_t
>
(
srcImage
.
m_layers
.
size
());
const
auto
dstLayerCount
=
static_cast
<
uint32_t
>
(
dstImage
.
m_layers
.
size
());
vk
::
ImageResolve
region
(
vk
::
ImageSubresourceLayers
(
vk
::
ImageAspectFlagBits
::
eColor
,
0
,
0
,
src
Image
.
m_layers
),
vk
::
ImageSubresourceLayers
(
vk
::
ImageAspectFlagBits
::
eColor
,
0
,
0
,
src
LayerCount
),
vk
::
Offset3D
(
0
,
0
,
0
),
vk
::
ImageSubresourceLayers
(
vk
::
ImageAspectFlagBits
::
eColor
,
0
,
0
,
dst
Image
.
m_layers
),
vk
::
ImageSubresourceLayers
(
vk
::
ImageAspectFlagBits
::
eColor
,
0
,
0
,
dst
LayerCount
),
vk
::
Offset3D
(
0
,
0
,
0
),
vk
::
Extent3D
(
dstImage
.
m_width
,
dstImage
.
m_height
,
dstImage
.
m_depth
)
);
...
...
@@ -609,9 +647,9 @@ namespace vkcv {
cmdBuffer
.
resolveImage
(
srcImage
.
m_handle
,
srcImage
.
m_lay
out
,
srcImage
.
m_lay
ers
[
0
]
,
dstImage
.
m_handle
,
dstImage
.
m_lay
out
,
dstImage
.
m_lay
ers
[
0
]
,
region
);
}
...
...
@@ -656,7 +694,7 @@ namespace vkcv {
uint32_t
ImageManager
::
getImageArrayLayers
(
const
ImageHandle
&
handle
)
const
{
auto
&
image
=
(
*
this
)
[
handle
];
return
image
.
m_layers
;
return
static_cast
<
uint32_t
>
(
image
.
m_layers
.
size
())
;
}
void
ImageManager
::
setCurrentSwapchainImageIndex
(
int
index
)
{
...
...
@@ -686,17 +724,18 @@ namespace vkcv {
height
,
1
,
format
,
1
,
vk
::
ImageLayout
::
eUndefined
,
{
vk
::
ImageLayout
::
eUndefined
},
false
});
}
}
void
ImageManager
::
updateImageLayoutManual
(
const
vkcv
::
ImageHandle
&
handle
,
const
vk
::
ImageLayout
layout
)
{
vk
::
ImageLayout
layout
)
{
auto
&
image
=
(
*
this
)
[
handle
];
image
.
m_layout
=
layout
;
for
(
auto
&
layer
:
image
.
m_layers
)
{
layer
=
layout
;
}
}
}
// namespace vkcv
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/vkcv/ImageManager.hpp
+
2
−
3
View file @
59b78edb
...
...
@@ -35,8 +35,7 @@ namespace vkcv {
uint32_t
m_depth
;
vk
::
Format
m_format
;
uint32_t
m_layers
;
vk
::
ImageLayout
m_layout
;
std
::
vector
<
vk
::
ImageLayout
>
m_layers
;
bool
m_storage
;
};
...
...
@@ -140,6 +139,6 @@ namespace vkcv {
// if manual vulkan work, e.g. ImGui integration, changes an image layout this function must
// be used to update the internal image state
void
updateImageLayoutManual
(
const
vkcv
::
ImageHandle
&
handle
,
const
vk
::
ImageLayout
layout
);
void
updateImageLayoutManual
(
const
vkcv
::
ImageHandle
&
handle
,
vk
::
ImageLayout
layout
);
};
}
// namespace vkcv
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment