blob: e8a5754770940022c79fb3204872a1f026853eb8 [file] [log] [blame]
Mark Lobodzinskid42e4d22017-01-17 14:14:22 -07001/* Copyright (c) 2015-2017 The Khronos Group Inc.
2 * Copyright (c) 2015-2017 Valve Corporation
3 * Copyright (c) 2015-2017 LunarG, Inc.
4 * Copyright (C) 2015-2017 Google Inc.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Mark Lobodzinski <mark@lunarg.com>
19 */
20#ifndef CORE_VALIDATION_BUFFER_VALIDATION_H_
21#define CORE_VALIDATION_BUFFER_VALIDATION_H_
22
23#include "core_validation_types.h"
Mark Lobodzinski90224de2017-01-26 15:23:11 -070024#include "core_validation_error_enums.h"
Mark Lobodzinskid42e4d22017-01-17 14:14:22 -070025#include "vulkan/vk_layer.h"
26#include <memory>
27#include <unordered_map>
28#include <vector>
Mark Lobodzinski9ef5d562017-01-27 12:28:30 -070029#include <utility>
Mark Lobodzinski3c0f6362017-02-01 13:35:48 -070030#include <algorithm>
31
32
33
34
Mark Lobodzinskid42e4d22017-01-17 14:14:22 -070035
Mark Lobodzinski90224de2017-01-26 15:23:11 -070036
37bool PreCallValidateCreateImage(core_validation::layer_data *device_data, const VkImageCreateInfo *pCreateInfo,
38 const VkAllocationCallbacks *pAllocator, VkImage *pImage);
39
Mark Lobodzinski214144a2017-01-27 14:25:32 -070040void PostCallRecordCreateImage(core_validation::layer_data *device_data, const VkImageCreateInfo *pCreateInfo, VkImage *pImage);
Mark Lobodzinski42fe5f72017-01-11 11:36:16 -070041
Mark Lobodzinski9ef5d562017-01-27 12:28:30 -070042void PostCallRecordDestroyImage(core_validation::layer_data *device_data, VkImage image, IMAGE_STATE *image_state,
43 VK_OBJECT obj_struct);
44
45bool PreCallValidateDestroyImage(core_validation::layer_data *device_data, VkImage image, IMAGE_STATE **image_state,
46 VK_OBJECT *obj_struct);
47
Mark Lobodzinskic409a582017-01-27 15:16:01 -070048bool ValidateImageAttributes(core_validation::layer_data *device_data, IMAGE_STATE *image_state, VkImageSubresourceRange range);
49
Mark Lobodzinski9c93dbd2017-02-02 08:31:18 -070050void ResolveRemainingLevelsLayers(core_validation::layer_data *dev_data, VkImageSubresourceRange *range, IMAGE_STATE *image_state);
Mark Lobodzinskid81d1012017-02-01 09:03:06 -070051
52void ResolveRemainingLevelsLayers(core_validation::layer_data *dev_data, uint32_t *levels, uint32_t *layers,
Mark Lobodzinski9c93dbd2017-02-02 08:31:18 -070053 VkImageSubresourceRange range, IMAGE_STATE *image_state);
Mark Lobodzinskid81d1012017-02-01 09:03:06 -070054
Mark Lobodzinski9c93dbd2017-02-02 08:31:18 -070055bool VerifyClearImageLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *image_state,
Mark Lobodzinskid81d1012017-02-01 09:03:06 -070056 VkImageSubresourceRange range, VkImageLayout dest_image_layout, const char *func_name);
57
58void RecordClearImageLayout(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *cb_node, VkImage image,
59 VkImageSubresourceRange range, VkImageLayout dest_image_layout);
60
61bool PreCallValidateCmdClearColorImage(core_validation::layer_data *dev_data, VkCommandBuffer commandBuffer, VkImage image,
62 VkImageLayout imageLayout, uint32_t rangeCount, const VkImageSubresourceRange *pRanges);
63
64void PreCallRecordCmdClearImage(core_validation::layer_data *dev_data, VkCommandBuffer commandBuffer, VkImage image,
65 VkImageLayout imageLayout, uint32_t rangeCount, const VkImageSubresourceRange *pRanges,
66 CMD_TYPE cmd_type);
67
68bool PreCallValidateCmdClearDepthStencilImage(core_validation::layer_data *dev_data, VkCommandBuffer commandBuffer, VkImage image,
69 VkImageLayout imageLayout, uint32_t rangeCount,
70 const VkImageSubresourceRange *pRanges);
71
Mark Lobodzinski3c0f6362017-02-01 13:35:48 -070072bool FindLayoutVerifyNode(core_validation::layer_data *device_data, GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair,
73 IMAGE_CMD_BUF_LAYOUT_NODE &node, const VkImageAspectFlags aspectMask);
74
75bool FindLayoutVerifyLayout(core_validation::layer_data *device_data, ImageSubresourcePair imgpair, VkImageLayout &layout,
76 const VkImageAspectFlags aspectMask);
77
78bool FindCmdBufLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *pCB, VkImage image, VkImageSubresource range,
79 IMAGE_CMD_BUF_LAYOUT_NODE &node);
80
81bool FindGlobalLayout(core_validation::layer_data *device_data, ImageSubresourcePair imgpair, VkImageLayout &layout);
82
83bool FindLayouts(core_validation::layer_data *device_data, VkImage image, std::vector<VkImageLayout> &layouts);
84
85void SetGlobalLayout(core_validation::layer_data *device_data, ImageSubresourcePair imgpair, const VkImageLayout &layout);
86
87void SetLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair,
88 const IMAGE_CMD_BUF_LAYOUT_NODE &node);
89
90void SetLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair,
91 const VkImageLayout &layout);
92
93void SetImageViewLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *pCB, VkImageView imageView,
94 const VkImageLayout &layout);
95
96bool VerifyFramebufferAndRenderPassLayouts(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB,
97 const VkRenderPassBeginInfo *pRenderPassBegin,
98 const FRAMEBUFFER_STATE *framebuffer_state);
99
100void TransitionAttachmentRefLayout(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB, FRAMEBUFFER_STATE *pFramebuffer,
101 VkAttachmentReference ref);
102
103void TransitionSubpassLayouts(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB,
104 const VkRenderPassBeginInfo *pRenderPassBegin, const int subpass_index,
105 FRAMEBUFFER_STATE *framebuffer_state);
106
107bool TransitionImageAspectLayout(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB,
108 const VkImageMemoryBarrier *mem_barrier, uint32_t level, uint32_t layer,
109 VkImageAspectFlags aspect);
110
111bool TransitionImageLayouts(core_validation::layer_data *device_data, VkCommandBuffer cmdBuffer, uint32_t memBarrierCount,
112 const VkImageMemoryBarrier *pImgMemBarriers);
113
114bool VerifySourceImageLayout(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *cb_node, VkImage srcImage,
115 VkImageSubresourceLayers subLayers, VkImageLayout srcImageLayout,
116 UNIQUE_VALIDATION_ERROR_CODE msgCode);
117
118bool VerifyDestImageLayout(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *cb_node, VkImage destImage,
119 VkImageSubresourceLayers subLayers, VkImageLayout destImageLayout, UNIQUE_VALIDATION_ERROR_CODE msgCode);
120
121void TransitionFinalSubpassLayouts(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB,
122 const VkRenderPassBeginInfo *pRenderPassBegin, FRAMEBUFFER_STATE *framebuffer_state);
123
Mark Lobodzinskib39d2ec2017-02-02 14:38:47 -0700124bool PreCallValidateCmdCopyImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
125 IMAGE_STATE *dst_image_state, uint32_t region_count, const VkImageCopy *regions);
126
Mark Lobodzinski2def2bf2017-02-02 15:22:50 -0700127bool PreCallValidateCmdClearAttachments(core_validation::layer_data *device_data, VkCommandBuffer commandBuffer,
128 uint32_t attachmentCount, const VkClearAttachment *pAttachments, uint32_t rectCount,
129 const VkClearRect *pRects);
130
Mark Lobodzinski8e0c0bf2017-02-06 11:06:26 -0700131bool PreCallValidateCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
Mark Lobodzinski2a3368e2017-02-06 15:29:37 -0700132 IMAGE_STATE *dst_image_state, uint32_t regionCount, const VkImageResolve *pRegions);
Mark Lobodzinski8e0c0bf2017-02-06 11:06:26 -0700133
134void PreCallRecordCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
135 IMAGE_STATE *dst_image_state);
136
137bool PreCallValidateCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
Mark Lobodzinski9ad96582017-02-06 14:01:54 -0700138 IMAGE_STATE *dst_image_state, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter);
Mark Lobodzinski8e0c0bf2017-02-06 11:06:26 -0700139
140void PreCallRecordCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
141 IMAGE_STATE *dst_image_state);
142
Mark Lobodzinski4a3065e2017-02-07 16:36:03 -0700143bool ValidateCmdBufImageLayouts(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB);
Mark Lobodzinski8e0c0bf2017-02-06 11:06:26 -0700144
Mark Lobodzinski9a8d40f2017-02-07 17:00:12 -0700145bool ValidateMaskBitsFromLayouts(core_validation::layer_data *device_data, VkCommandBuffer cmdBuffer,
146 const VkAccessFlags &accessMask, const VkImageLayout &layout, const char *type);
Mark Lobodzinskib3829a52017-02-07 16:55:53 -0700147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700148#endif // CORE_VALIDATION_BUFFER_VALIDATION_H_