summaryrefslogtreecommitdiff
path: root/video.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'video.cpp')
-rw-r--r--video.cpp78
1 files changed, 12 insertions, 66 deletions
diff --git a/video.cpp b/video.cpp
index 089735c..8203eea 100644
--- a/video.cpp
+++ b/video.cpp
@@ -3,7 +3,6 @@
#define device_heap_size (1024 * 1024 * 8)
#define max_textures 1024
-#define max_texture_alias 32
#define max_buffers 1024
#define max_vertex_formats 64
#define max_rpos 64
@@ -671,8 +670,6 @@ struct Texture_Vk : public Texture, public Late_Terminated {
Vram_Allocator::Allocation memory;
Resource_State state;
Texture_Id parent;
- Texture_Id children[max_texture_alias];
- int child_count;
static void init(
Texture_Vk* t,
@@ -695,9 +692,6 @@ struct Texture_Vk : public Texture, public Late_Terminated {
);
void destroy(Device_Vk*) override;
void set_name(Device_Vk* dev, const char* name);
- void add_child(Texture_Id id);
- void rem_child(Texture_Id id);
- bool child_states_same(Device_Vk* dev);
};
struct Buffer_Vk : public Buffer, public Late_Terminated {
@@ -2383,35 +2377,17 @@ void Context::transition(Texture_Id id, Resource_State state) {
Device_Vk* dev = ctx->dev;
Texture_Vk& tex = *(Texture_Vk*)&dev->get_texture(id);
VkImageMemoryBarrier b{};
- int c = tex.child_count;
VkImageLayout src_layout = state_to_image_layout(tex.state);
VkImageLayout dst_layout = state_to_image_layout(state);
VkPipelineStageFlags src_stage, dst_stage;
- if (c) {
- if (tex.child_states_same(dev)) {
- tex.state =
- ((Texture_Vk*)&dev->get_texture(tex.children[0]))->state;
- src_layout = state_to_image_layout(tex.state);
- } else {
- ctx->check_end_rp();
- int i;
- for (i = 0; i < c; i++) {
- transition(tex.children[i], state);
- }
- tex.state = state;
- return;
- }
+ if (tex.parent) {
+ transition(tex.parent, state);
+ tex.state = state;
+ return;
}
if (tex.state == state) return;
ctx->check_end_rp();
- tex.state = state; {
- int i;
- for (i = 0; i < c; i++) {
- Texture_Vk& child =
- *(Texture_Vk*)&dev->get_texture(tex.children[i]);
- child.state = state;
- }
- }
+ tex.state = state;
b.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
b.oldLayout = src_layout;
b.newLayout = dst_layout;
@@ -2576,6 +2552,9 @@ std::pair<Renderpass_Vk&, Framebuffer_Vk&> Context_Vk::begin_rp(
for (i = 0; i < c; i++) {
VkClearValue clear{};
const auto& tar = rp.colours[i];
+ auto& tex = *(Texture_Vk*)&dev->get_texture(tar.id);
+ if (tex.parent)
+ transition(tex.id, render_target);
const auto col = tar.clear.colour;
clear.color.float32[0] = (float)col.r / 255.0f;
clear.color.float32[1] = (float)col.g / 255.0f;
@@ -2585,6 +2564,9 @@ std::pair<Renderpass_Vk&, Framebuffer_Vk&> Context_Vk::begin_rp(
}
if (has_depth) {
VkClearValue dc{};
+ auto& tex = *(Texture_Vk*)&dev->get_texture(rp.depth.id);
+ if (tex.parent)
+ transition(tex.id, render_target);
dc.depthStencil.depth = rp.depth.clear.depth;
dc.depthStencil.stencil = 0; /* todo */
clears[clear_count++] = dc;
@@ -3789,7 +3771,7 @@ Texture_Id Device::alias_texture(
texture.image,
view,
Vram_Allocator::Allocation::null(),
- Resource_State::undefined,
+ texture.state,
fmt,
flags,
w,
@@ -3801,7 +3783,6 @@ Texture_Id Device::alias_texture(
start_array,
true
);
- texture.add_child(ntid);
nt.set_name(dev, name);
return ntid;
}
@@ -3825,37 +3806,6 @@ void Texture_Vk::set_name(Device_Vk* dev, const char* name) {
#endif
}
-void Texture_Vk::add_child(Texture_Id id) {
- assert(child_count < max_texture_alias);
- children[child_count++] = id;
-}
-
-void Texture_Vk::rem_child(Texture_Id id) {
- int i;
- for (i = 0; i < child_count; i++) {
- if (children[i] == id) {
- children[i] = children[child_count - 1];
- return;
- }
- }
-}
-
-bool Texture_Vk::child_states_same(Device_Vk* dev) {
- int i, c = child_count;
- bool r = true;
- for (i = 0; i < c; i++) {
- Texture_Vk& a =
- *(Texture_Vk*)&dev->get_texture(children[i]);
- int j;
- for (j = i + 1; j < c; j++) {
- Texture_Vk& b =
- *(Texture_Vk*)&dev->get_texture(children[j]);
- if (a.state != b.state) r = false;
- }
- }
- return r;
-}
-
Shader& Device::get_shader(Shader_Id id) {
Device_Vk* dev = (Device_Vk*)this;
assert(id.index);
@@ -4137,10 +4087,6 @@ void Texture_Vk::destroy(Device_Vk* dev) {
vkDestroyImage(dev->dev, image, &dev->ac);
dev->vrama.free(memory);
}
- if (parent) {
- Texture_Vk& t = *(Texture_Vk*)&dev->get_texture(parent);
- t.rem_child(id);
- }
vkDestroyImageView(dev->dev, view, &dev->ac);
dev->textures.remove(id);
}