を編集するためのコマンドバッファを作成:私は何とか自分のバルカンのアプリケーションでvkCmdDrawIndexed中にセグメンテーション違反を得ることができたセグメンテーションフォルト二度目
==6785==
==6785== Process terminating with default action of signal 11 (SIGSEGV)
==6785== Access not within mapped region at address 0xE0
==6785== at 0xA138542: cvdescriptorset::DescriptorSet::ValidateDrawState(std::map<unsigned int, descriptor_req, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, descriptor_req> > > const&, std::vector<unsigned int, std::allocator<unsigned int> > const&, std::string*) const (in /home/user/VulkanSDK/1.0.37.0/x86_64/lib/libVkLayer_core_validation.so)
==6785== by 0xA0D9A06: core_validation::validate_and_update_draw_state(core_validation::layer_data*, GLOBAL_CB_NODE*, bool, VkPipelineBindPoint, char const*) (in /home/user/VulkanSDK/1.0.37.0/x86_64/lib/libVkLayer_core_validation.so)
==6785== by 0xA0EE4F3: core_validation::CmdDrawIndexed(VkCommandBuffer_T*, unsigned int, unsigned int, unsigned int, int, unsigned int) (in /home/user/VulkanSDK/1.0.37.0/x86_64/lib/libVkLayer_core_validation.so)
==6785== by 0xA8B6F23: object_tracker::CmdDrawIndexed(VkCommandBuffer_T*, unsigned int, unsigned int, unsigned int, int, unsigned int) (in /home/user/VulkanSDK/1.0.37.0/x86_64/lib/libVkLayer_object_tracker.so)
==6785== by 0xB3AD421: threading::CmdDrawIndexed(VkCommandBuffer_T*, unsigned int, unsigned int, unsigned int, int, unsigned int) (in /home/user/VulkanSDK/1.0.37.0/x86_64/lib/libVkLayer_threading.so)
==6785== by 0x13B147: VulkanRenderer::createCommandBuffers(ObjectInRAM*, ObjectInRAM*) (in /home/wobbi/git/Code/Implementierungen/Vulkan/VulkanTest)
==6785== by 0x13F1FF: VulkanRenderer::mainLoop() (in /home/wobbi/git/Code/Implementierungen/Vulkan/VulkanTest)
==6785== by 0x110716: main (in /home/wobbi/git/Code/Implementierungen/Vulkan/VulkanTest)
:ここ はvalgrindのの出力です。 私がしようとしているのは、私は2つのオブジェクトを描きたいのです。最初の1回だけ、2回目のオブジェクトは、異なる位置で(インスタンス化せずに)可変回数を繰り返します。私はpushConstantsを介して異なる位置を取得し、すべてがうまく動作します。
ボタンを押すと、2番目のオブジェクトが描画される回数を増やしたいので、デバイスがアイドル状態になるまで待ってから、新しい描画回数でコマンドバッファを再作成します。
しかし、コマンドバッファの再作成中に、次のようなセグメンテーションが発生します。 vkCmdDrawIndexed(commandBuffers [i]、obj2-> indices.size()、1,0,0,0);
私のコードはVulkan-Tutorial.comに基づいているので、私はちょうどcreateCommandBuffers()関数を再度呼び出します。
プールを割り当てたのは、 です。poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
私はセグメンテーションフォルトを取得する理由上の任意の助け
いただければ幸いですコード:それは層内部のクラッシュのように見えるのコールスタックから
void VulkanRenderer::mainLoop()
{
float lastTextureChange = glfwGetTime();
float lastFPSUpdate = glfwGetTime();
int numFrames = 0;
int lastGPULoad = 1;
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
//adjust camera values
//if frames are further apart then movement between frames has to be faster
float currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
do_movement();
updateUniformBuffer(glm::vec3(0.0f), 0.1f);
if(lastGPULoad != GPULoad)
{
lastGPULoad = GPULoad;
recreateSwapChain();
}
drawFrame();
}
vkDeviceWaitIdle(device);
glfwDestroyWindow(window);
}
void VulkanRenderer::recreateSwapChain()
{
vkDeviceWaitIdle(device);
createSwapChain();
createImageViews();
createRenderPass();
createGraphicsPipeline();
createDepthResources();
createFramebuffers();
createCommandBuffers(&male, &cube);
}
void VulkanRenderer::createCommandBuffers(ObjectInRAM* obj, ObjectInRAM* obj2)
{
//check if old command buffers are still around and free them
if (commandBuffers.size() > 0)
{
vkFreeCommandBuffers(device, commandPool, commandBuffers.size(), commandBuffers.data());
}
commandBuffers.resize(swapChainFramebuffers.size());
std::cout <<"creating new command buffers:" <<commandBuffers.size() <<std::endl;
VkCommandBufferAllocateInfo allocInfo = {};
allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
allocInfo.commandPool = commandPool;
allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
allocInfo.commandBufferCount = (uint32_t) commandBuffers.size();
if (vkAllocateCommandBuffers(device, &allocInfo, commandBuffers.data()) != VK_SUCCESS) {
throw std::runtime_error("failed to allocate command buffers!");
}
for (size_t i = 0; i < commandBuffers.size(); i++) {
VkCommandBufferBeginInfo beginInfo = {};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
beginInfo.pInheritanceInfo = nullptr; // Optional
vkBeginCommandBuffer(commandBuffers[i], &beginInfo);
VkRenderPassBeginInfo renderPassInfo = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassInfo.renderPass = renderPass;
renderPassInfo.framebuffer = swapChainFramebuffers[i];
renderPassInfo.renderArea.offset = {0};
renderPassInfo.renderArea.extent = swapChainExtent;
std::array<VkClearValue, 2> clearValues = {};
clearValues[0].color = {0.0f, 0.0f, 0.0f, 1.0f};
clearValues[1].depthStencil = {1.0f, 0};
renderPassInfo.clearValueCount = clearValues.size();
renderPassInfo.pClearValues = clearValues.data();
updateUniformBuffer(glm::vec3(80.0f, 80.0f, 80.0f), 10.0f);
vkCmdBeginRenderPass(commandBuffers[i], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
pushUBO.model = glm::mat4();
pushUBO.model = glm::scale(pushUBO.model, glm::vec3(1.0f));
// Submit via push constant (rather than a UBO)
vkCmdPushConstants(
commandBuffers[i],
pipelineLayout,
VK_SHADER_STAGE_VERTEX_BIT,
0,
sizeof(pushUBO),
&pushUBO
);
vkCmdBindPipeline(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, nullptr);
//Binding vertex buffers
VkBuffer vertexBuffers[] = {obj2->vertexBuffer};
VkDeviceSize offsets[] = {0};
vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offsets);
vkCmdBindIndexBuffer(commandBuffers[i], obj2->indexBuffer, 0, VK_INDEX_TYPE_UINT32);
std::cout <<"bound index: " <<obj2->indices.size() <<std::endl;
vkCmdDrawIndexed(commandBuffers[i], obj2->indices.size(), 1,0,0,0);
std::cout <<"before crowd cmd recording " <<std::endl;
//render crowd
vertexBuffers[0] = obj->vertexBuffer;
vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offsets);
vkCmdBindIndexBuffer(commandBuffers[i], obj->indexBuffer, 0, VK_INDEX_TYPE_UINT32);
int drawCmdCounter = 0;
while(drawCmdCounter < GPULoad)
{
pushUBO.model = glm::mat4();
pushUBO.model = glm::translate(pushUBO.model, glm::vec3(drawCmdCounter*5.0f, 0.0f,0.0f));
// Submit via push constant (rather than a UBO)
vkCmdPushConstants(
commandBuffers[i],
pipelineLayout,
VK_SHADER_STAGE_VERTEX_BIT,
0,
sizeof(pushUBO),
&pushUBO
);
vkCmdDrawIndexed(commandBuffers[i], obj->indices.size(), 1,0,0,0);
drawCmdCounter++;
}
vkCmdEndRenderPass(commandBuffers[i]);
if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS) {
throw std::runtime_error("failed to record command buffer!");
}
}
}
ようこそStackOverflow。質問を明確にするには、[最小限で完全で検証可能なサンプルを作成する方法](https://stackoverflow.com/help/mcve)を参照してください。 – lnman
飛行中にコマンドバッファを上書きしないように、適切な同期が取れていますか?また、検証レイヤーを有効にして、出力にエラーがないかどうかを確認します。適切な同期と検証が正常に行われている場合は、コールスタックをポストしてください。 –
'無効VulkanRenderer :: recreateSwapChain() { vkDeviceWaitIdle(device); //スワップチェーンを再作成 createCommandBuffers(); } ' 私は、私が多かれ少なかれ描画呼び出しが必要であることに気がついたら、私のメインループでこの関数を呼び出します。デバイスがアイドル状態になるのを待っているため、コマンドバッファが空になっていないことを確認できますか? – wobbi