blob: 251d234d90312ead96b9898595f3878505f9e494 [file] [log] [blame]
/* Copyright (c) 2019-2026 The Khronos Group Inc.
* Copyright (c) 2019-2026 Valve Corporation
* Copyright (c) 2019-2026 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <vulkan/vulkan.h>
#include "sync/sync_common.h"
#include "sync/sync_access_context.h"
#include "sync/sync_op.h"
#include <optional>
struct LastBound;
namespace vvl {
class CommandBuffer;
}
namespace syncval {
enum class AttachmentType { kColor, kDepth, kStencil };
struct DynamicRenderingInfo {
struct Attachment {
const vku::safe_VkRenderingAttachmentInfo &info;
std::shared_ptr<const vvl::ImageView> view;
std::shared_ptr<const vvl::ImageView> resolve_view;
ImageRangeGen view_gen;
std::optional<ImageRangeGen> resolve_gen;
AttachmentType type;
Attachment(const SyncValidator &state, const vku::safe_VkRenderingAttachmentInfo &info, const AttachmentType type_,
const VkOffset3D &offset, const VkExtent3D &extent);
SyncAccessIndex GetLoadUsage() const;
SyncAccessIndex GetStoreUsage() const;
SyncOrdering GetOrdering() const;
Location GetLocation(const Location &loc, uint32_t index = 0) const;
bool IsWriteable(const LastBound &last_bound_state) const;
bool IsValid() const { return view.get(); }
};
// attachments store references to this info, so make sure this doesn't get moved around.
DynamicRenderingInfo(const DynamicRenderingInfo &) = delete;
DynamicRenderingInfo(DynamicRenderingInfo &&) = delete;
DynamicRenderingInfo &operator=(const DynamicRenderingInfo &) = delete;
DynamicRenderingInfo &operator=(DynamicRenderingInfo &&) = delete;
DynamicRenderingInfo(const SyncValidator &state, const VkRenderingInfo &rendering_info);
const vvl::ImageView *GetClearAttachmentView(const VkClearAttachment &clear_attachment) const;
vku::safe_VkRenderingInfo info;
std::vector<Attachment> attachments; // All attachments (with internal typing)
};
struct BeginRenderingCmdState {
BeginRenderingCmdState(std::shared_ptr<const vvl::CommandBuffer> &&cb_state_) : cb_state(std::move(cb_state_)) {}
void AddRenderingInfo(const SyncValidator &state, const VkRenderingInfo &rendering_info);
const DynamicRenderingInfo &GetRenderingInfo() const;
std::shared_ptr<const vvl::CommandBuffer> cb_state;
std::unique_ptr<DynamicRenderingInfo> info;
};
std::unique_ptr<AccessContext[]> InitSubpassContexts(VkQueueFlags queue_flags, const vvl::RenderPass &rp_state,
const AccessContext &external_context);
using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
class RenderPassAccessContext {
public:
static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
const std::vector<const vvl::ImageView *> &attachment_views);
RenderPassAccessContext()
: rp_state_(nullptr), render_area_(VkRect2D()), render_pass_instance_id_(vvl::kNoIndex32), current_subpass_(0) {}
RenderPassAccessContext(const vvl::RenderPass &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
const std::vector<const vvl::ImageView *> &attachment_views, const AccessContext &external_context,
uint32_t render_pass_instance_id);
static bool ValidateLayoutTransitions(const CommandBufferAccessContext &cb_context, const AccessContext &access_context,
const vvl::RenderPass &rp_state, const VkRect2D &render_area,
uint32_t render_pass_instance_id, uint32_t subpass,
const AttachmentViewGenVector &attachment_views, vvl::Func command);
static bool ValidateLoadOperation(const CommandBufferAccessContext &cb_context, const AccessContext &access_context,
const vvl::RenderPass &rp_state, const VkRect2D &render_area,
uint32_t render_pass_instance_id, uint32_t subpass,
const AttachmentViewGenVector &attachment_views, vvl::Func command);
bool ValidateStoreOperation(const CommandBufferAccessContext &cb_context, vvl::Func command) const;
bool ValidateResolveOperations(const CommandBufferAccessContext &cb_context, vvl::Func command) const;
static void UpdateAttachmentResolveAccess(const vvl::RenderPass &rp_state, const AttachmentViewGenVector &attachment_views,
uint32_t render_pass_instance_id, uint32_t subpass, const ResourceUsageTag tag,
AccessContext &access_context);
static void UpdateAttachmentStoreAccess(const vvl::RenderPass &rp_state, const AttachmentViewGenVector &attachment_views,
uint32_t render_pass_instance_id, uint32_t subpass, const ResourceUsageTag tag,
AccessContext &access_context);
static void RecordLayoutTransitions(const vvl::RenderPass &rp_state, uint32_t subpass,
const AttachmentViewGenVector &attachment_views, const ResourceUsageTag tag,
AccessContext &access_context);
bool ValidateDrawSubpassAttachment(const CommandBufferAccessContext &cb_context, vvl::Func command) const;
void RecordDrawSubpassAttachment(const vvl::CommandBuffer &cmd_buffer, ResourceUsageTag tag);
const vvl::ImageView *GetClearAttachmentView(const VkClearAttachment &clear_attachment) const;
bool ValidateNextSubpass(const CommandBufferAccessContext &cb_context, vvl::Func command) const;
bool ValidateEndRenderPass(const CommandBufferAccessContext &cb_context, vvl::Func command) const;
bool ValidateFinalSubpassLayoutTransitions(const CommandBufferAccessContext &cb_context, vvl::Func command) const;
void RecordLayoutTransitions(ResourceUsageTag tag);
void RecordLoadOperations(ResourceUsageTag tag);
void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
uint32_t GetCurrentSubpass() const { return current_subpass_; }
AccessContext &CurrentContext();
const AccessContext &CurrentContext() const;
vvl::span<const AccessContext> GetSubpassContexts() const;
vvl::span<AccessContext> GetSubpassContexts();
const vvl::RenderPass *GetRenderPassState() const { return rp_state_; }
AccessContext *CreateStoreResolveProxy() const;
private:
AttachmentAccess GetAttachmentAccess(SyncOrdering ordering, AttachmentAccessType type = AttachmentAccessType::Access) const;
private:
const vvl::RenderPass *rp_state_;
const VkRect2D render_area_;
const AttachmentViewGenVector attachment_views_;
const std::unique_ptr<AccessContext[]> subpass_contexts_;
const uint32_t render_pass_instance_id_;
uint32_t current_subpass_;
};
} // namespace syncval