VkPipelineColorBlend ReadingException


#1

Hello, I’m working at the moment at a little graphic Engine which uses Vulkan for rendering.
For this I’ve a little problem: I don’t understand why I get a breakpoint with Visual Studio: The problem is that I get the Error-Code:
`Exception throw at 0x00007FFAE3C66A66 (amdvlk64.dll) in PhoenixEngine.exe: 0xC0000005: access to injury while reading at position 0x000000000000000A.
The red X of visual studio is pointing at the line where I create the Instance.
Though testing I know while activating Color Blending, so here is the Code:

			VkPipelineColorBlendAttachmentState colorBlendAttachment;
			colorBlendAttachment.blendEnable = VK_TRUE;
			colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
			colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
			colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
			colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
			colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
			colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;
			colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;

		
			VkPipelineColorBlendStateCreateInfo colorBlendCreateInfo;
			colorBlendCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
			colorBlendCreateInfo.pNext = nullptr;
			colorBlendCreateInfo.flags = 0;
			colorBlendCreateInfo.logicOpEnable = VK_FALSE;
			colorBlendCreateInfo.logicOp = VK_LOGIC_OP_NO_OP;
			colorBlendCreateInfo.attachmentCount = 1;
			colorBlendCreateInfo.pAttachments = &colorBlendAttachment;
			colorBlendCreateInfo.blendConstants[0] = 0.0f;
			colorBlendCreateInfo.blendConstants[1] = 0.0f;
			colorBlendCreateInfo.blendConstants[2] = 0.0f;
			colorBlendCreateInfo.blendConstants[3] = 0.0f;

Interisting is, that this code is running later than creating the Instance.
This line of code I use to create the Instance:

VkResult result = vkCreateInstance(&instanceCreateInfo, nullptr, &instance);

When I comment out the creating of VkPipelineColorBlendStateCreateInfo, I don’t get this error. Do you have an Idea about what I’m doing wrong?


#2

Hi @Fawkes.
Do you have any error messages for Validation Layers ?
Could you attach a minimal simple project ?


#3

Hi @AndreyOGL_D3D,
No, I don’t have any error messages for Validation Layers. The output of the application is only what Layers and Extensions are available. After that I get the error message from Visual Studio.
I don’t know how I could make the project simpler. But I’m working on to clean up my code.
So while rewriting my code (in hope to find the mistake) a small errormessage from validation layer is visible. It says I should put the value for queuePriorities between zero and one. But the strange thing is: I’ve done this:

VkDeviceQueueCreateInfo GraphicEngine::createQueueCreateInfo(uint32_t & amountOfQueueFamilies, VkQueueFamilyProperties * queueFamilyProperties)
{
	VkDeviceQueueCreateInfo deviceQueueCreateInfo;
	deviceQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
	deviceQueueCreateInfo.pNext = NULL;
	deviceQueueCreateInfo.flags = 0;
	//GetBest QueueFamily: Graphic Bit and Transfering Bit
	bool found = false;
	for (int i = 0; i < amountOfQueueFamilies; i++)
	{
		if ((queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) > 0 && (queueFamilyProperties[i].queueFlags & VK_QUEUE_TRANSFER_BIT) > 0)
		{
			found = true;
			deviceQueueCreateInfo.queueFamilyIndex = i;
		}
	}
	if (found)
	{
		if (queueFamilyProperties[deviceQueueCreateInfo.queueFamilyIndex].queueCount >= 1)
		{
			deviceQueueCreateInfo.queueCount = 1;
		}
		std::cout << "[DEBUGGING] QUEUEINDEX=" << deviceQueueCreateInfo.queueFamilyIndex << std::endl;
		const float queuePrios[] = { 1.0};
		deviceQueueCreateInfo.pQueuePriorities = queuePrios;
		return deviceQueueCreateInfo;
	}
	else
	{
		std::cerr << "Crazy Graphic Card: No good QueueFamily" << std::endl;
		exit(-3);
	}
	return deviceQueueCreateInfo;
}

I don’t know wether the queueIndex with enabled Graphic and Transfering Bit is the best for my project, or a other queue.
But the value in QueuePrios[0] is 1.88 * 10^15, says the validation layer. So it is not really a value between 0 and 1. Maybe I had these little error before too and I overlooked this little mistake.
So does anyone have an Idea how to solve the issue with the wrong value in the float array to describe queuePriorities?


#4

const float queuePrios[] = { 1.0};
deviceQueueCreateInfo.pQueuePriorities = queuePrios;
return deviceQueueCreateInfo;

You use adress of local variable after return from function body.