改进配合测试
This commit is contained in:
parent
ffb14f48d4
commit
52d153677d
@ -60,8 +60,11 @@ namespace
|
|||||||
Device::Device(DeviceAttribute *da)
|
Device::Device(DeviceAttribute *da)
|
||||||
{
|
{
|
||||||
attr=da;
|
attr=da;
|
||||||
current_framebuffer=0;
|
|
||||||
|
current_frame=0;
|
||||||
|
|
||||||
image_acquired_semaphore=this->CreateSem();
|
image_acquired_semaphore=this->CreateSem();
|
||||||
|
draw_fence=this->CreateFence();
|
||||||
|
|
||||||
present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
present.pNext = nullptr;
|
present.pNext = nullptr;
|
||||||
@ -73,7 +76,11 @@ Device::Device(DeviceAttribute *da)
|
|||||||
}
|
}
|
||||||
Device::~Device()
|
Device::~Device()
|
||||||
{
|
{
|
||||||
|
const uint32_t sc_count=attr->sc_image_views.GetCount();
|
||||||
|
|
||||||
delete image_acquired_semaphore;
|
delete image_acquired_semaphore;
|
||||||
|
delete draw_fence;
|
||||||
|
|
||||||
delete attr;
|
delete attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,15 +149,15 @@ RenderPass *Device::CreateRenderPass()
|
|||||||
attachments[0].finalLayout=VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
attachments[0].finalLayout=VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||||
attachments[0].flags=0;
|
attachments[0].flags=0;
|
||||||
|
|
||||||
attachments[1].format=attr->depth.format;
|
//attachments[1].format=attr->depth.format;
|
||||||
attachments[1].samples=VK_SAMPLE_COUNT_1_BIT;
|
//attachments[1].samples=VK_SAMPLE_COUNT_1_BIT;
|
||||||
attachments[1].loadOp=VK_ATTACHMENT_LOAD_OP_CLEAR;
|
//attachments[1].loadOp=VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||||
attachments[1].storeOp=VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
//attachments[1].storeOp=VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
attachments[1].stencilLoadOp=VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
//attachments[1].stencilLoadOp=VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
attachments[1].stencilStoreOp=VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
//attachments[1].stencilStoreOp=VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
attachments[1].initialLayout=VK_IMAGE_LAYOUT_UNDEFINED;
|
//attachments[1].initialLayout=VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
attachments[1].finalLayout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
//attachments[1].finalLayout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
attachments[1].flags=0;
|
//attachments[1].flags=0;
|
||||||
|
|
||||||
VkAttachmentReference color_reference={0,VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
|
VkAttachmentReference color_reference={0,VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
|
||||||
VkAttachmentReference depth_reference={1,VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
|
VkAttachmentReference depth_reference={1,VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
|
||||||
@ -163,19 +170,27 @@ RenderPass *Device::CreateRenderPass()
|
|||||||
subpass.colorAttachmentCount=1;
|
subpass.colorAttachmentCount=1;
|
||||||
subpass.pColorAttachments=&color_reference;
|
subpass.pColorAttachments=&color_reference;
|
||||||
subpass.pResolveAttachments=nullptr;
|
subpass.pResolveAttachments=nullptr;
|
||||||
subpass.pDepthStencilAttachment=&depth_reference;
|
subpass.pDepthStencilAttachment=nullptr;//&depth_reference;
|
||||||
subpass.preserveAttachmentCount=0;
|
subpass.preserveAttachmentCount=0;
|
||||||
subpass.pPreserveAttachments=nullptr;
|
subpass.pPreserveAttachments=nullptr;
|
||||||
|
|
||||||
|
VkSubpassDependency dependency = {};
|
||||||
|
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
|
||||||
|
dependency.dstSubpass = 0;
|
||||||
|
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
dependency.srcAccessMask = 0;
|
||||||
|
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
|
|
||||||
VkRenderPassCreateInfo rp_info={};
|
VkRenderPassCreateInfo rp_info={};
|
||||||
rp_info.sType=VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
rp_info.sType=VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
rp_info.pNext=nullptr;
|
rp_info.pNext=nullptr;
|
||||||
rp_info.attachmentCount=2;
|
rp_info.attachmentCount=1;
|
||||||
rp_info.pAttachments=attachments;
|
rp_info.pAttachments=attachments;
|
||||||
rp_info.subpassCount=1;
|
rp_info.subpassCount=1;
|
||||||
rp_info.pSubpasses=&subpass;
|
rp_info.pSubpasses=&subpass;
|
||||||
rp_info.dependencyCount=0;
|
rp_info.dependencyCount=1;
|
||||||
rp_info.pDependencies=nullptr;
|
rp_info.pDependencies=&dependency;
|
||||||
|
|
||||||
VkRenderPass render_pass;
|
VkRenderPass render_pass;
|
||||||
|
|
||||||
@ -192,12 +207,12 @@ Fence *Device::CreateFence()
|
|||||||
fenceInfo.pNext = nullptr;
|
fenceInfo.pNext = nullptr;
|
||||||
fenceInfo.flags = 0;
|
fenceInfo.flags = 0;
|
||||||
|
|
||||||
VkFence drawFence;
|
VkFence fence;
|
||||||
|
|
||||||
if(vkCreateFence(attr->device, &fenceInfo, nullptr, &drawFence)!=VK_SUCCESS)
|
if(vkCreateFence(attr->device, &fenceInfo, nullptr, &fence)!=VK_SUCCESS)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
return(new Fence(attr->device,drawFence));
|
return(new Fence(attr->device,fence));
|
||||||
}
|
}
|
||||||
|
|
||||||
Semaphore *Device::CreateSem()
|
Semaphore *Device::CreateSem()
|
||||||
@ -216,48 +231,48 @@ Semaphore *Device::CreateSem()
|
|||||||
|
|
||||||
bool Device::AcquireNextImage()
|
bool Device::AcquireNextImage()
|
||||||
{
|
{
|
||||||
return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,*image_acquired_semaphore,VK_NULL_HANDLE,¤t_framebuffer)==VK_SUCCESS);
|
return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,*image_acquired_semaphore,VK_NULL_HANDLE,¤t_frame)==VK_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::QueueSubmit(CommandBuffer *buf,Fence *fence)
|
bool Device::QueueSubmit(CommandBuffer *buf)
|
||||||
{
|
{
|
||||||
if(!buf||!fence)
|
if(!buf)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
VkSubmitInfo submit_info[1] = {};
|
VkSubmitInfo submit_info = {};
|
||||||
|
|
||||||
VkSemaphore sem=*image_acquired_semaphore;
|
VkSemaphore wait_sem=*image_acquired_semaphore;
|
||||||
VkCommandBuffer cmd_bufs=*buf;
|
VkCommandBuffer cmd_bufs=*buf;
|
||||||
|
|
||||||
submit_info[0].pNext = nullptr;
|
submit_info.pNext = nullptr;
|
||||||
submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
submit_info[0].waitSemaphoreCount = 1;
|
submit_info.waitSemaphoreCount = 1;
|
||||||
submit_info[0].pWaitSemaphores = &sem;
|
submit_info.pWaitSemaphores = &wait_sem;
|
||||||
submit_info[0].pWaitDstStageMask = &pipe_stage_flags;
|
submit_info.pWaitDstStageMask = &pipe_stage_flags;
|
||||||
submit_info[0].commandBufferCount = 1;
|
submit_info.commandBufferCount = 1;
|
||||||
submit_info[0].pCommandBuffers = &cmd_bufs;
|
submit_info.pCommandBuffers = &cmd_bufs;
|
||||||
submit_info[0].signalSemaphoreCount = 0;
|
submit_info.signalSemaphoreCount = 0;
|
||||||
submit_info[0].pSignalSemaphores = nullptr;
|
submit_info.pSignalSemaphores = nullptr;
|
||||||
|
|
||||||
return(vkQueueSubmit(attr->graphics_queue, 1, submit_info, *fence)==VK_SUCCESS);
|
return(vkQueueSubmit(attr->graphics_queue, 1, &submit_info, *draw_fence)==VK_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::Wait(Fence *f,bool wait_all,uint64_t time_out)
|
bool Device::Wait(bool wait_all,uint64_t time_out)
|
||||||
{
|
{
|
||||||
VkResult res;
|
VkFence fence=*draw_fence;
|
||||||
VkFence fence=*f;
|
|
||||||
|
|
||||||
do {
|
vkWaitForFences(attr->device, 1, &fence, wait_all, time_out);
|
||||||
res = vkWaitForFences(attr->device, 1, &fence, wait_all, time_out);
|
vkResetFences(attr->device,1,&fence);
|
||||||
} while (res == VK_TIMEOUT);
|
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::QueuePresent()
|
bool Device::QueuePresent()
|
||||||
{
|
{
|
||||||
present.pImageIndices = ¤t_framebuffer;
|
present.pImageIndices = ¤t_frame;
|
||||||
|
present.waitSemaphoreCount = 0;
|
||||||
|
present.pWaitSemaphores = nullptr;
|
||||||
|
|
||||||
return(vkQueuePresentKHR(attr->present_queue, &present)==VK_SUCCESS);
|
return(vkQueuePresentKHR(attr->present_queue, &present)==VK_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -15,12 +15,16 @@ class RenderPass;
|
|||||||
class Fence;
|
class Fence;
|
||||||
class Semaphore;
|
class Semaphore;
|
||||||
|
|
||||||
|
#define MAX_FRAMES_IN_FLIGHT 2
|
||||||
|
|
||||||
class Device
|
class Device
|
||||||
{
|
{
|
||||||
DeviceAttribute *attr;
|
DeviceAttribute *attr;
|
||||||
|
|
||||||
Semaphore *image_acquired_semaphore;
|
Semaphore *image_acquired_semaphore;
|
||||||
uint32_t current_framebuffer;
|
Fence *draw_fence;
|
||||||
|
|
||||||
|
uint32_t current_frame;
|
||||||
|
|
||||||
VkPresentInfoKHR present;
|
VkPresentInfoKHR present;
|
||||||
|
|
||||||
@ -44,8 +48,11 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
VkImageView GetColorImageView (int index=-1) {return GetObject(attr->sc_image_views,index==-1?current_framebuffer:index);}
|
const uint32_t GetSwapChainImageCount ()const {return attr->sc_image_views.GetCount();}
|
||||||
VkImageView GetDepthImageView () {return attr->depth.view;}
|
VkImageView GetColorImageView (int index) {return GetObject(attr->sc_image_views,index);}
|
||||||
|
VkImageView GetDepthImageView () {return attr->depth.view;}
|
||||||
|
|
||||||
|
const uint32_t GetCurrentFrameIndices () {return current_frame;}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -71,8 +78,8 @@ public:
|
|||||||
Semaphore * CreateSem();
|
Semaphore * CreateSem();
|
||||||
|
|
||||||
bool AcquireNextImage ();
|
bool AcquireNextImage ();
|
||||||
bool QueueSubmit (CommandBuffer *,Fence *);
|
bool QueueSubmit (CommandBuffer *);
|
||||||
bool Wait (Fence *,bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1);
|
bool Wait (bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1);
|
||||||
bool QueuePresent ();
|
bool QueuePresent ();
|
||||||
};//class Device
|
};//class Device
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include"VKDevice.h"
|
#include"VKDevice.h"
|
||||||
#include"VKInstance.h"
|
#include"VKInstance.h"
|
||||||
#include"VKPhysicalDevice.h"
|
#include"VKPhysicalDevice.h"
|
||||||
|
#include"VKFramebuffer.h"
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
VkSurfaceKHR CreateRenderDevice(VkInstance,Window *);
|
VkSurfaceKHR CreateRenderDevice(VkInstance,Window *);
|
||||||
@ -109,11 +110,8 @@ namespace
|
|||||||
swapchain_ci.clipped=true;
|
swapchain_ci.clipped=true;
|
||||||
swapchain_ci.imageColorSpace=VK_COLORSPACE_SRGB_NONLINEAR_KHR;
|
swapchain_ci.imageColorSpace=VK_COLORSPACE_SRGB_NONLINEAR_KHR;
|
||||||
swapchain_ci.imageUsage=VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
swapchain_ci.imageUsage=VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||||
swapchain_ci.imageSharingMode=VK_SHARING_MODE_EXCLUSIVE;
|
|
||||||
swapchain_ci.queueFamilyIndexCount=0;
|
|
||||||
swapchain_ci.pQueueFamilyIndices=nullptr;
|
|
||||||
|
|
||||||
uint32_t queueFamilyIndices[2]={(uint32_t)rsa->graphics_family, (uint32_t)rsa->present_family};
|
uint32_t queueFamilyIndices[2]={rsa->graphics_family, rsa->present_family};
|
||||||
if(rsa->graphics_family!=rsa->present_family)
|
if(rsa->graphics_family!=rsa->present_family)
|
||||||
{
|
{
|
||||||
// If the graphics and present queues are from different queue families,
|
// If the graphics and present queues are from different queue families,
|
||||||
@ -124,6 +122,10 @@ namespace
|
|||||||
swapchain_ci.queueFamilyIndexCount=2;
|
swapchain_ci.queueFamilyIndexCount=2;
|
||||||
swapchain_ci.pQueueFamilyIndices=queueFamilyIndices;
|
swapchain_ci.pQueueFamilyIndices=queueFamilyIndices;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
swapchain_ci.imageSharingMode=VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
}
|
||||||
|
|
||||||
VkSwapchainKHR swap_chain;
|
VkSwapchainKHR swap_chain;
|
||||||
|
|
||||||
|
@ -125,16 +125,19 @@ Instance *CreateInstance(const UTF8String &app_name)
|
|||||||
const char *validation_layers[]=
|
const char *validation_layers[]=
|
||||||
{
|
{
|
||||||
// "VK_LAYER_LUNARG_api_dump",
|
// "VK_LAYER_LUNARG_api_dump",
|
||||||
// "VK_LAYER_LUNARG_assistant_layer",
|
"VK_LAYER_LUNARG_assistant_layer",
|
||||||
"VK_LAYER_LUNARG_core_validation",
|
"VK_LAYER_LUNARG_core_validation",
|
||||||
// "VK_LAYER_LUNARG_device_simulation",
|
// "VK_LAYER_LUNARG_device_simulation",
|
||||||
// "VK_LAYER_LUNARG_monitor",
|
"VK_LAYER_LUNARG_monitor",
|
||||||
"VK_LAYER_LUNARG_object_tracker",
|
"VK_LAYER_LUNARG_object_tracker",
|
||||||
"VK_LAYER_LUNARG_standard_validation",
|
"VK_LAYER_LUNARG_standard_validation",
|
||||||
"VK_LAYER_LUNARG_parameter_validation",
|
"VK_LAYER_LUNARG_parameter_validation",
|
||||||
// "VK_LAYER_LUNARG_vktrace",
|
// "VK_LAYER_LUNARG_vktrace",
|
||||||
|
// "VK_LAYER_RENDERDOC_Capture",
|
||||||
|
|
||||||
// "VK_LAYER_KHRONOS_validation",
|
"VK_LAYER_KHRONOS_validation",
|
||||||
|
|
||||||
|
// "VK_LAYER_NV_nsight-sys",
|
||||||
|
|
||||||
"VK_LAYER_GOOGLE_unique_objects",
|
"VK_LAYER_GOOGLE_unique_objects",
|
||||||
"VK_LAYER_GOOGLE_threading"
|
"VK_LAYER_GOOGLE_threading"
|
||||||
|
@ -19,6 +19,20 @@ PipelineCreater::PipelineCreater(Device *dev)
|
|||||||
hgl_zero(pipelineInfo);
|
hgl_zero(pipelineInfo);
|
||||||
pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||||
|
|
||||||
|
{
|
||||||
|
vis_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||||
|
vis_create_info.pNext = nullptr;
|
||||||
|
vis_create_info.flags = 0;
|
||||||
|
|
||||||
|
vis_create_info.vertexBindingDescriptionCount = 0;
|
||||||
|
vis_create_info.pVertexBindingDescriptions = nullptr;
|
||||||
|
|
||||||
|
vis_create_info.vertexAttributeDescriptionCount = 0;
|
||||||
|
vis_create_info.pVertexAttributeDescriptions = nullptr;
|
||||||
|
|
||||||
|
pipelineInfo.pVertexInputState=&vis_create_info;
|
||||||
|
}
|
||||||
|
|
||||||
viewport.x = 0.0f;
|
viewport.x = 0.0f;
|
||||||
viewport.y = 0.0f;
|
viewport.y = 0.0f;
|
||||||
viewport.width = extent.width;
|
viewport.width = extent.width;
|
||||||
@ -42,8 +56,8 @@ PipelineCreater::PipelineCreater(Device *dev)
|
|||||||
depthStencilState.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
depthStencilState.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
||||||
depthStencilState.pNext = nullptr;
|
depthStencilState.pNext = nullptr;
|
||||||
depthStencilState.flags = 0;
|
depthStencilState.flags = 0;
|
||||||
depthStencilState.depthTestEnable = VK_TRUE;
|
depthStencilState.depthTestEnable = VK_FALSE;
|
||||||
depthStencilState.depthWriteEnable = VK_TRUE;
|
depthStencilState.depthWriteEnable = VK_FALSE;
|
||||||
depthStencilState.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL;
|
depthStencilState.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL;
|
||||||
depthStencilState.depthBoundsTestEnable = VK_FALSE;
|
depthStencilState.depthBoundsTestEnable = VK_FALSE;
|
||||||
depthStencilState.minDepthBounds = 0;
|
depthStencilState.minDepthBounds = 0;
|
||||||
@ -66,8 +80,8 @@ PipelineCreater::PipelineCreater(Device *dev)
|
|||||||
rasterizer.depthClampEnable = VK_FALSE;
|
rasterizer.depthClampEnable = VK_FALSE;
|
||||||
rasterizer.rasterizerDiscardEnable = VK_FALSE;
|
rasterizer.rasterizerDiscardEnable = VK_FALSE;
|
||||||
rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
|
rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
|
||||||
rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
|
rasterizer.cullMode = VK_CULL_MODE_FRONT_AND_BACK;
|
||||||
rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
|
rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE;
|
||||||
rasterizer.depthBiasEnable = VK_FALSE;
|
rasterizer.depthBiasEnable = VK_FALSE;
|
||||||
rasterizer.depthBiasConstantFactor = 0;
|
rasterizer.depthBiasConstantFactor = 0;
|
||||||
rasterizer.depthBiasClamp = 0;
|
rasterizer.depthBiasClamp = 0;
|
||||||
@ -117,6 +131,8 @@ PipelineCreater::PipelineCreater(Device *dev)
|
|||||||
dynamicState.flags = 0;
|
dynamicState.flags = 0;
|
||||||
dynamicState.pDynamicStates = dynamicStateEnables;
|
dynamicState.pDynamicStates = dynamicStateEnables;
|
||||||
dynamicState.dynamicStateCount = 0;
|
dynamicState.dynamicStateCount = 0;
|
||||||
|
dynamicStateEnables[dynamicState.dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT;
|
||||||
|
dynamicStateEnables[dynamicState.dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR;
|
||||||
|
|
||||||
pipelineInfo.pDynamicState=&dynamicState;
|
pipelineInfo.pDynamicState=&dynamicState;
|
||||||
|
|
||||||
@ -147,7 +163,6 @@ bool PipelineCreater::Set(const VertexInput *vi)
|
|||||||
|
|
||||||
vis_create_info=vertex_input->GetPipelineVertexInputStateCreateInfo();
|
vis_create_info=vertex_input->GetPipelineVertexInputStateCreateInfo();
|
||||||
|
|
||||||
pipelineInfo.pVertexInputState=&vis_create_info;
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,6 +172,8 @@ bool PipelineCreater::Set(const VkPrimitiveTopology topology,bool restart)
|
|||||||
if(topology!=PRIM_RECTANGLE)return(false);
|
if(topology!=PRIM_RECTANGLE)return(false);
|
||||||
|
|
||||||
inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
||||||
|
inputAssembly.pNext = nullptr;
|
||||||
|
inputAssembly.flags = 0;
|
||||||
inputAssembly.topology = (topology==PRIM_RECTANGLE?VK_PRIMITIVE_TOPOLOGY_POINT_LIST:topology);
|
inputAssembly.topology = (topology==PRIM_RECTANGLE?VK_PRIMITIVE_TOPOLOGY_POINT_LIST:topology);
|
||||||
inputAssembly.primitiveRestartEnable = restart;
|
inputAssembly.primitiveRestartEnable = restart;
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@ namespace hgl
|
|||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
break;
|
break;
|
||||||
|
case WM_PAINT:
|
||||||
|
return 0;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -70,40 +70,43 @@ vulkan::Shader *LoadShader(VkDevice device)
|
|||||||
return(nullptr);
|
return(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr float vertex_data[]={0.0f,0.5f, -0.5f,-0.5f, 0.5f,-0.5f };
|
//constexpr float vertex_data[]={0.0f,0.5f, -0.5f,-0.5f, 0.5f,-0.5f };
|
||||||
constexpr float color_data[]={1,0,0, 0,1,0, 0,0,1 };
|
//constexpr float color_data[]={1,0,0, 0,1,0, 0,0,1 };
|
||||||
|
//
|
||||||
vulkan::VertexInput *CreateVertexBuffer(vulkan::Device *dev)
|
//vulkan::VertexBuffer *vertex_buffer=nullptr;
|
||||||
{
|
//vulkan::VertexBuffer *color_buffer=nullptr;
|
||||||
vulkan::VertexBuffer *vb=dev->CreateVBO(FMT_RG32F,6*sizeof(float));
|
//
|
||||||
vulkan::VertexBuffer *cb=dev->CreateVBO(FMT_RGB32F,9*sizeof(float));
|
//vulkan::VertexInput *CreateVertexBuffer(vulkan::Device *dev)
|
||||||
|
//{
|
||||||
{
|
// vertex_buffer=dev->CreateVBO(FMT_RG32F,6*sizeof(float));
|
||||||
float *p=(float *)vb->Map();
|
// color_buffer=dev->CreateVBO(FMT_RGB32F,9*sizeof(float));
|
||||||
|
//
|
||||||
memcpy(p,vertex_data,6*sizeof(float));
|
// {
|
||||||
|
// float *p=(float *)vertex_buffer->Map();
|
||||||
vb->Unmap();
|
//
|
||||||
}
|
// memcpy(p,vertex_data,6*sizeof(float));
|
||||||
|
//
|
||||||
{
|
// vertex_buffer->Unmap();
|
||||||
float *p=(float *)cb->Map();
|
// }
|
||||||
|
//
|
||||||
memcpy(p,color_data,9*sizeof(float));
|
// {
|
||||||
|
// float *p=(float *)color_buffer->Map();
|
||||||
cb->Unmap();
|
//
|
||||||
}
|
// memcpy(p,color_data,9*sizeof(float));
|
||||||
|
//
|
||||||
vulkan::VertexInput *vi=new vulkan::VertexInput();
|
// color_buffer->Unmap();
|
||||||
|
// }
|
||||||
constexpr uint32_t position_shader_location=0; //对应shader中的layout(locaiton=0,暂时这样写
|
//
|
||||||
constexpr uint32_t color_shader_location=1;
|
// vulkan::VertexInput *vi=new vulkan::VertexInput();
|
||||||
|
//
|
||||||
vi->Add(position_shader_location, vb);
|
// constexpr uint32_t position_shader_location=0; //对应shader中的layout(locaiton=0,暂时这样写
|
||||||
vi->Add(color_shader_location, cb);
|
// constexpr uint32_t color_shader_location=1;
|
||||||
|
//
|
||||||
return vi;
|
// vi->Add(position_shader_location, vertex_buffer);
|
||||||
}
|
// vi->Add(color_shader_location, color_buffer);
|
||||||
|
//
|
||||||
|
// return vi;
|
||||||
|
//}
|
||||||
|
|
||||||
void wait_seconds(int seconds) {
|
void wait_seconds(int seconds) {
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@ -166,10 +169,9 @@ int main(int,char **)
|
|||||||
if(!shader)
|
if(!shader)
|
||||||
return -3;
|
return -3;
|
||||||
|
|
||||||
vulkan::Fence *fence=device->CreateFence();
|
|
||||||
vulkan::Semaphore *sem=device->CreateSem();
|
vulkan::Semaphore *sem=device->CreateSem();
|
||||||
|
|
||||||
vulkan::VertexInput *vi=CreateVertexBuffer(device);
|
// vulkan::VertexInput *vi=CreateVertexBuffer(device);
|
||||||
|
|
||||||
vulkan::PipelineCreater pc(device);
|
vulkan::PipelineCreater pc(device);
|
||||||
vulkan::RenderPass *rp=device->CreateRenderPass();
|
vulkan::RenderPass *rp=device->CreateRenderPass();
|
||||||
@ -179,7 +181,7 @@ int main(int,char **)
|
|||||||
vulkan::PipelineLayout *pl=CreatePipelineLayout(device->GetDevice(),dsl);
|
vulkan::PipelineLayout *pl=CreatePipelineLayout(device->GetDevice(),dsl);
|
||||||
|
|
||||||
pc.Set(shader);
|
pc.Set(shader);
|
||||||
pc.Set(vi);
|
//pc.Set(vi);
|
||||||
pc.Set(PRIM_TRIANGLES);
|
pc.Set(PRIM_TRIANGLES);
|
||||||
pc.Set(*pl);
|
pc.Set(*pl);
|
||||||
pc.Set(*rp);
|
pc.Set(*rp);
|
||||||
@ -189,32 +191,44 @@ int main(int,char **)
|
|||||||
if(!pipeline)
|
if(!pipeline)
|
||||||
return(-4);
|
return(-4);
|
||||||
|
|
||||||
device->AcquireNextImage(); //这样才会得到current_framebuffer的值,下面的device->GetColorImageView()才会正确
|
device->AcquireNextImage();
|
||||||
|
|
||||||
vulkan::Framebuffer *fb=vulkan::CreateFramebuffer(device,rp,device->GetColorImageView(),device->GetDepthImageView());
|
const int image_count=device->GetSwapChainImageCount();
|
||||||
|
vulkan::Framebuffer **fb=new vulkan::Framebuffer *[image_count];
|
||||||
|
|
||||||
cmd_buf->Begin(rp,fb);
|
for(int i=0;i<image_count;i++)
|
||||||
|
fb[i]=vulkan::CreateFramebuffer(device,rp,device->GetColorImageView(i));
|
||||||
|
|
||||||
|
cmd_buf->Begin(rp,fb[0]);
|
||||||
cmd_buf->Bind(pipeline);
|
cmd_buf->Bind(pipeline);
|
||||||
cmd_buf->Bind(pl);
|
cmd_buf->Bind(pl);
|
||||||
cmd_buf->Bind(vi);
|
// cmd_buf->Bind(vi);
|
||||||
cmd_buf->Draw(3);
|
cmd_buf->Draw(3);
|
||||||
cmd_buf->End();
|
cmd_buf->End();
|
||||||
|
|
||||||
device->QueueSubmit(cmd_buf,fence);
|
device->QueueSubmit(cmd_buf);
|
||||||
device->Wait(fence);
|
device->Wait();
|
||||||
device->QueuePresent();
|
device->QueuePresent();
|
||||||
|
|
||||||
wait_seconds(3);
|
wait_seconds(1);
|
||||||
|
|
||||||
|
for(int i=0;i<image_count;i++)
|
||||||
|
delete fb[i];
|
||||||
|
delete[] fb;
|
||||||
|
|
||||||
delete pipeline;
|
delete pipeline;
|
||||||
|
|
||||||
|
delete pl;
|
||||||
|
delete dsl;
|
||||||
|
|
||||||
delete sem;
|
delete sem;
|
||||||
delete fence;
|
|
||||||
delete rp;
|
delete rp;
|
||||||
|
|
||||||
delete vi;
|
// delete vi;
|
||||||
// delete ubo;
|
// delete ubo;
|
||||||
|
|
||||||
|
delete shader;
|
||||||
|
|
||||||
delete cmd_buf;
|
delete cmd_buf;
|
||||||
delete device;
|
delete device;
|
||||||
delete inst;
|
delete inst;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user