Как реализовать правило трех/пяти/ноля с массивами производных объектов? ⇐ C++
Как реализовать правило трех/пяти/ноля с массивами производных объектов?
Я пытаюсь создать массив производных объектов, но мое приложение вызывает несколько ошибок проверки при закрытии программы:
vkDestroyDescriptorPool(): неверный объект VkDescriptorPool 0x625f640000000058 Не удалось найти объект VkDescriptorPool 0x625f640000000058. Не удалось найти объект VkDescriptorPool 0x625f640000000058. Эти три строки также возвращаются для каждого производного объекта для их переменных vkDescriptorSetLayout и вызова функции vkDestroyDescriptorSetLayout.
У меня была похожая проблема при использовании VkShaderModule с объектом std::vector, но мне удалось обойти эту проблему, используя базовый массив моего code>Класс шейдера:
vk::Shader planeShaders[] = { {"plane.vert", VK_SHADER_STAGE_VERTEX_BIT}, {"plane.frag", VK_SHADER_STAGE_FRAGMENT_BIT} }; К сожалению, это решение не работает с производными объектами моего объекта Descriptor:
vk::Descriptor descriptors[] = { vk::UBO{ униформа, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_COMPUTE_BIT }, vk::Sampler{ planks.mipLevels }, vk::Texture{ "textures/planks.png" } }; Если объекты определены в пространстве имен vk как:
struct Descriptor { VkDescriptorSetLayout SetLayout; std::vector Наборы; Дескриптор (тип VkDescriptorType, флаг VkShaderStageFlags, uint32_tbindingCount = 1) { /* создание и размещение дескрипторов VkDescriptorSetLayout и VkDescriptorPool */ } ~Дескриптор() { vkDestroyDescriptorPool (GPU::device, Pool, nullptr); vkDestroyDescriptorSetLayout (GPU::device, SetLayout, nullptr); } защищено: Пул VkDescriptorPool; } struct Sampler: Дескриптор { Сэмплер VkSampler; Sampler(uint32_t mipLevels = 1, VkShaderStageFlagBitsshaderFlags = VK_SHADER_STAGE_FRAGMENT_BIT): Дескриптор(VK_DESCRIPTOR_TYPE_SAMPLER,shaderFlags) { /* конструкция производного объекта */ } ~Сэмплер() { vkDestroySampler(GPU::device, sampler, nullptr); } }; Я ожидал, что унаследованные переменные из объекта Descriptor будут равны определенным переменным-членам производных классов, хранящимся в массиве vk::Descriptor descriptors[] , но, похоже, это не так. Переменная-член VkSampler не вызывает ошибку уровня проверки при вызове vkDestroySampler, равно как и VkBuffer и VkDeviceMember переменные объекта UBO, когда деструктор UBO вызывает функции vkDestroyBuffer и vkFreeMemory.
Я подозреваю, что это связано с наследованием объекта Descriptor объектами UBO, Sampler и Texture< /код> объекты. Я думаю, это можно исправить, реализовав правило трех/пяти/нуля, но я понятия не имею, как решение, основанное на этих правилах, будет реализовано для производных объектов, хранящихся в массиве их общего наследника.
Это случай правила трех/пяти/ноля или здесь происходит нечто большее? Как бы я реализовал эти правила для описанного выше или аналогичного сценария, где унаследованные переменные не «равны» переменным, определенным в производных объектах?
Изменить:
Этот вопрос не касается нарезки объектов.
VkDescriptorPool и VkDescriptorSetLayout определены в vk::Descriptor.
vk::Descriptor наследуется от vk::Sampler, vk::Texture и vk::UBO< /код>.
Если бы это была проблема с нарезкой, то VkDescriptorPool и VkDescriptorSetLayout не были бы вырезаны из vk::Sampler, vk: :Texture и vk::UBO.
Я пытаюсь создать массив производных объектов, но мое приложение вызывает несколько ошибок проверки при закрытии программы:
vkDestroyDescriptorPool(): неверный объект VkDescriptorPool 0x625f640000000058 Не удалось найти объект VkDescriptorPool 0x625f640000000058. Не удалось найти объект VkDescriptorPool 0x625f640000000058. Эти три строки также возвращаются для каждого производного объекта для их переменных vkDescriptorSetLayout и вызова функции vkDestroyDescriptorSetLayout.
У меня была похожая проблема при использовании VkShaderModule с объектом std::vector, но мне удалось обойти эту проблему, используя базовый массив моего code>Класс шейдера:
vk::Shader planeShaders[] = { {"plane.vert", VK_SHADER_STAGE_VERTEX_BIT}, {"plane.frag", VK_SHADER_STAGE_FRAGMENT_BIT} }; К сожалению, это решение не работает с производными объектами моего объекта Descriptor:
vk::Descriptor descriptors[] = { vk::UBO{ униформа, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_COMPUTE_BIT }, vk::Sampler{ planks.mipLevels }, vk::Texture{ "textures/planks.png" } }; Если объекты определены в пространстве имен vk как:
struct Descriptor { VkDescriptorSetLayout SetLayout; std::vector Наборы; Дескриптор (тип VkDescriptorType, флаг VkShaderStageFlags, uint32_tbindingCount = 1) { /* создание и размещение дескрипторов VkDescriptorSetLayout и VkDescriptorPool */ } ~Дескриптор() { vkDestroyDescriptorPool (GPU::device, Pool, nullptr); vkDestroyDescriptorSetLayout (GPU::device, SetLayout, nullptr); } защищено: Пул VkDescriptorPool; } struct Sampler: Дескриптор { Сэмплер VkSampler; Sampler(uint32_t mipLevels = 1, VkShaderStageFlagBitsshaderFlags = VK_SHADER_STAGE_FRAGMENT_BIT): Дескриптор(VK_DESCRIPTOR_TYPE_SAMPLER,shaderFlags) { /* конструкция производного объекта */ } ~Сэмплер() { vkDestroySampler(GPU::device, sampler, nullptr); } }; Я ожидал, что унаследованные переменные из объекта Descriptor будут равны определенным переменным-членам производных классов, хранящимся в массиве vk::Descriptor descriptors[] , но, похоже, это не так. Переменная-член VkSampler не вызывает ошибку уровня проверки при вызове vkDestroySampler, равно как и VkBuffer и VkDeviceMember переменные объекта UBO, когда деструктор UBO вызывает функции vkDestroyBuffer и vkFreeMemory.
Я подозреваю, что это связано с наследованием объекта Descriptor объектами UBO, Sampler и Texture< /код> объекты. Я думаю, это можно исправить, реализовав правило трех/пяти/нуля, но я понятия не имею, как решение, основанное на этих правилах, будет реализовано для производных объектов, хранящихся в массиве их общего наследника.
Это случай правила трех/пяти/ноля или здесь происходит нечто большее? Как бы я реализовал эти правила для описанного выше или аналогичного сценария, где унаследованные переменные не «равны» переменным, определенным в производных объектах?
Изменить:
Этот вопрос не касается нарезки объектов.
VkDescriptorPool и VkDescriptorSetLayout определены в vk::Descriptor.
vk::Descriptor наследуется от vk::Sampler, vk::Texture и vk::UBO< /код>.
Если бы это была проблема с нарезкой, то VkDescriptorPool и VkDescriptorSetLayout не были бы вырезаны из vk::Sampler, vk: :Texture и vk::UBO.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение