本文整理汇总了C++中VulkanDC类的典型用法代码示例。如果您正苦于以下问题:C++ VulkanDC类的具体用法?C++ VulkanDC怎么用?C++ VulkanDC使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了VulkanDC类的18个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: initDrawCommands
void VkeDrawCall::initDrawCommands(const uint32_t inCount, const uint32_t inCommandIndex){
VkPipelineLayout layout = m_renderer->getPipelineLayout();
VkPipeline pipeline = m_renderer->getPipeline();
VkDescriptorSet sceneDescriptor = m_renderer->getSceneDescriptorSet();
VkDescriptorSet *textureDescriptors = m_renderer->getTextureDescriptorSets();
VkBuffer sceneIndirectBuffer = m_renderer->getSceneIndirectBuffer();
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VulkanDC::Device::Queue *queue = dc->getDefaultQueue();
VulkanAppContext *ctxt = VulkanAppContext::GetInstance();
vkResetCommandBuffer(m_draw_command[inCommandIndex], 0);
VkCommandBufferBeginInfo cmdBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
VKA_CHECK_ERROR(vkBeginCommandBuffer(m_draw_command[inCommandIndex], &cmdBeginInfo), "Could not begin command buffer.\n");
vkCmdBindPipeline(m_draw_command[inCommandIndex], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
VkeVBO *theVBO = ctxt->getVBO();
VkeIBO *theIBO = ctxt->getIBO();
theVBO->bind(&m_draw_command[inCommandIndex]);
theIBO->bind(&m_draw_command[inCommandIndex]);
VkDescriptorSet sets[3] = { sceneDescriptor, textureDescriptors[0], m_transform_descriptor_set };
vkCmdBindDescriptorSets(m_draw_command[inCommandIndex], VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, 3, sets, 0, NULL);
vkCmdDrawIndexedIndirect(m_draw_command[inCommandIndex], sceneIndirectBuffer, 0, inCount, sizeof(VkDrawIndexedIndirectCommand));
vkCmdDraw(m_draw_command[inCommandIndex], 1, 1, 0, 0);
vkEndCommandBuffer(m_draw_command[inCommandIndex]);
/*
Lock mutex to update generated call count.
*/
//std::lock_guard<std::mutex> lk(m_renderer->getSecondaryCmdBufferMutex());
/*
Increment the generated call count
*/
m_renderer->incrementDrawCallsGenerated();
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:56,代码来源:VkeGameRendererDynamic.cpp
示例2: initDescriptorPool
void VkeDrawCall::initDescriptorPool(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VkDescriptorPoolSize poolSize = { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 };
VkDescriptorPoolCreateInfo poolInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO };
poolInfo.maxSets = 1;
poolInfo.poolSizeCount = 1;
poolInfo.pPoolSizes = &poolSize;
poolInfo.flags = 0;
VKA_CHECK_ERROR(vkCreateDescriptorPool(device->getVKDevice(), &poolInfo, NULL, &m_descriptor_pool), "Could not create descriptor pool.\n");
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:14,代码来源:VkeGameRendererDynamic.cpp
示例3: initTerrainCommand
void vkeGameRendererDynamic::initTerrainCommand(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VulkanDC::Device::Queue *queue = dc->getDefaultQueue();
uint32_t cmdID = 1021;
VkResult rslt;
for (uint32_t i = 0; i < 2; ++i){
if (m_terrain_command[i] != VK_NULL_HANDLE){
vkFreeCommandBuffers(device->getVKDevice(), queue->getCommandPool(), 1, &m_terrain_command[i]);
m_terrain_command[i] = VK_NULL_HANDLE;
}
{
VkCommandBufferAllocateInfo cmdBufInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
cmdBufInfo.commandBufferCount = 1;
cmdBufInfo.commandPool = queue->getCommandPool();
cmdBufInfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
rslt = vkAllocateCommandBuffers(device->getVKDevice(), &cmdBufInfo, &m_terrain_command[i]);
VkCommandBufferBeginInfo cmdBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
rslt = vkBeginCommandBuffer(m_terrain_command[i], &cmdBeginInfo);
vkCmdBindPipeline(m_terrain_command[i], VK_PIPELINE_BIND_POINT_GRAPHICS, m_quad_pipeline);
vkCmdBindDescriptorSets(m_terrain_command[i], VK_PIPELINE_BIND_POINT_GRAPHICS, m_quad_pipeline_layout, 0, 1, &m_quad_descriptor_set, 0, NULL);
m_screen_quad.bind(&m_terrain_command[i]);
m_screen_quad.draw(&m_terrain_command[i]);
vkCmdBindPipeline(m_terrain_command[i], VK_PIPELINE_BIND_POINT_GRAPHICS, m_terrain_pipeline);
vkCmdBindDescriptorSets(m_terrain_command[i], VK_PIPELINE_BIND_POINT_GRAPHICS, m_terrain_pipeline_layout, 0, 1, &m_terrain_descriptor_set, 0, NULL);
m_terrain_quad.bind(&m_terrain_command[i]);
m_terrain_quad.draw(&m_terrain_command[i]);/**/
vkEndCommandBuffer(m_terrain_command[i]);
}
}
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:46,代码来源:VkeGameRendererDynamic.cpp
示例4: releaseFramebuffer
void vkeGameRendererDynamic::releaseFramebuffer(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
device->waitIdle();
vkDestroyImageView(device->getVKDevice(), m_depth_attachment.view, NULL);
vkDestroyImageView(device->getVKDevice(), m_color_attachment.view, NULL);
vkDestroyImageView(device->getVKDevice(), m_resolve_attachment[0].view, NULL);
vkDestroyImageView(device->getVKDevice(), m_resolve_attachment[1].view, NULL);
m_depth_attachment.view = NULL;
m_color_attachment.view = NULL;
m_resolve_attachment[0].view = NULL;
m_resolve_attachment[1].view = NULL;
vkDestroyImage(device->getVKDevice(), m_depth_attachment.image, NULL);
vkDestroyImage(device->getVKDevice(), m_color_attachment.image, NULL);
vkDestroyImage(device->getVKDevice(), m_resolve_attachment[0].image, NULL);
vkDestroyImage(device->getVKDevice(), m_resolve_attachment[1].image, NULL);
m_depth_attachment.image = NULL;
m_color_attachment.image = NULL;
m_resolve_attachment[0].image = NULL;
m_resolve_attachment[1].image = NULL;
vkFreeMemory(device->getVKDevice(), m_depth_attachment.memory, NULL);
vkFreeMemory(device->getVKDevice(), m_color_attachment.memory, NULL);
vkFreeMemory(device->getVKDevice(), m_resolve_attachment[0].memory, NULL);
vkFreeMemory(device->getVKDevice(), m_resolve_attachment[1].memory, NULL);
m_depth_attachment.memory = NULL;
m_color_attachment.memory = NULL;
m_resolve_attachment[0].memory = NULL;
m_resolve_attachment[1].memory = NULL;
vkDestroyFramebuffer(device->getVKDevice(), m_framebuffers[0], NULL);
vkDestroyFramebuffer(device->getVKDevice(), m_framebuffers[1], NULL);
m_framebuffers[0] = NULL;
m_framebuffers[1] = NULL;
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:45,代码来源:VkeGameRendererDynamic.cpp
示例5: present
void vkeGameRendererDynamic::present(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VulkanDC::Device::Queue *queue = dc->getDefaultQueue();
glDisable(GL_DEPTH_TEST);
glWaitVkSemaphoreNV((GLuint64)m_render_done[m_current_buffer_index]);
glDrawVkImageNV((GLuint64)m_resolve_attachment[m_current_buffer_index].image, 0, 0, 0, m_width, m_height, 0, 0, 1, 1, 0);
glEnable(GL_DEPTH_TEST);
glSignalVkSemaphoreNV((GLuint64)m_present_done[m_current_buffer_index]);
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:18,代码来源:VkeGameRendererDynamic.cpp
示例6: initCommandPool
void VkeDrawCall::initCommandPool(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VkCommandPoolCreateInfo cmdPoolInfo = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };
cmdPoolInfo.queueFamilyIndex = 0;
cmdPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
VKA_CHECK_ERROR(vkCreateCommandPool(device->getVKDevice(), &cmdPoolInfo, NULL, &m_command_pool), "Could not create command pool.\n");
VkCommandBufferAllocateInfo cmdBufInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
cmdBufInfo.commandBufferCount = 2;
cmdBufInfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
cmdBufInfo.commandPool = m_command_pool;
VKA_CHECK_ERROR(vkAllocateCommandBuffers(device->getVKDevice(), &cmdBufInfo, m_draw_command), "Could not allocate secondary command buffers.\n");
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:20,代码来源:VkeGameRendererDynamic.cpp
示例7: initDescriptor
void VkeDrawCall::initDescriptor(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VkWriteDescriptorSet writes[1];
vkResetDescriptorPool(device->getVKDevice(), m_descriptor_pool, 0);
VkDescriptorSetAllocateInfo descAlloc = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO };
descAlloc.descriptorPool = m_descriptor_pool;
descAlloc.pSetLayouts = (m_renderer->getTransformDescriptorLayout());
descAlloc.descriptorSetCount = 1;
VKA_CHECK_ERROR(vkAllocateDescriptorSets(device->getVKDevice(), &descAlloc, &m_transform_descriptor_set), "Could not allocate descriptor sets.\n");
descriptorSetWrite(&writes[0], 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, (m_renderer->getTransformsDescriptor()), VK_NULL_HANDLE, 0, m_transform_descriptor_set);//transform
vkUpdateDescriptorSets(device->getVKDevice(), 1, writes, 0, NULL);
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:22,代码来源:VkeGameRendererDynamic.cpp
示例8: initDescriptorSets
void vkeGameRendererDynamic::initDescriptorSets(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
uint32_t count = 1;
if (!dc) return;
initCamera();
vkResetDescriptorPool(device->getVKDevice(), getDescriptorPool(), 0);
VkWriteDescriptorSet writes[5];
/*----------------------------------------------------------
Get the resource data for the bindings.
----------------------------------------------------------*/
/*
Terrain textures.
*/
VkeTexture::Data terrain = m_textures.getTexture(0)->getData();
/*
Camera and Light uniforms
*/
VkDescriptorBufferInfo camInfo = m_camera->getDescriptor();
VkDescriptorBufferInfo lightInfo = m_light->getDescriptor();
/*
Cube map texture.
*/
VkeCubeTexture::Data cube = m_cube_textures.getTexture(1)->getData();
/*
Create descriptor image info array
for the terrain textures.
*/
VkDescriptorImageInfo fpSampler = { terrain.sampler, terrain.view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL };
VkeMaterial *material = m_materials->getMaterial(0);
/*
Create descriptor image info array
for the scene textures.
*/
uint32_t texCount = m_materials->count();
VkDescriptorImageInfo *texImageInfo = (VkDescriptorImageInfo*)malloc(texCount * sizeof(VkDescriptorImageInfo));
for (uint32_t i = 0; i < texCount; ++i){
VkeMaterial *mtrl = m_materials->getMaterial(i);
VkeTexture::Data texData = mtrl->getTextures().getTexture(0)->getData();
texImageInfo[i].imageView = texData.view;
texImageInfo[i].sampler = texData.sampler;
}
/*
Create descriptor image info for
the cube map texture.
*/
VkDescriptorImageInfo cubeTexture;
cubeTexture.sampler = cube.sampler;
cubeTexture.imageView = cube.view;
cubeTexture.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
/*
Capture the layouts for the scene descriptor
sets and the texture descriptor sets.
*/
VkDescriptorSetLayout *textureLayouts = (VkDescriptorSetLayout*)malloc(sizeof(VkDescriptorSetLayout) * texCount);
for (uint32_t i = 0; i < texCount; ++i){
textureLayouts[i] = m_texture_descriptor_set_layout;
}
/*
Allocate storage for the scene and
texture descriptor sets.
*/
/*----------------------------------------------------------
Allocate the descriptor sets.
----------------------------------------------------------*/
m_texture_descriptor_sets = (VkDescriptorSet*)malloc(sizeof(VkDescriptorSet));
/*
Set up the alocate info structure for
the descriptor sets.
*/
VkDescriptorSetAllocateInfo descAlloc;
memset(&descAlloc, 0, sizeof(descAlloc));
descAlloc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
descAlloc.descriptorPool = getDescriptorPool();
//.........这里部分代码省略.........
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:101,代码来源:VkeGameRendererDynamic.cpp
示例9: update
void vkeGameRendererDynamic::update(){
VulkanAppContext *ctxt = VulkanAppContext::GetInstance();
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VkCommandBuffer cmd = VK_NULL_HANDLE;
VulkanDC::Device::Queue::CommandBufferID cmdID = INIT_COMMAND_ID + 300;
static float sTime = 0.0f;
static uint32_t *uniforms = NULL;
uint32_t cnt = m_node_data->count();
uint32_t sz = (sizeof(VkeNodeUniform) * cnt) + (m_instance_count * 64);
static bool ismapped(false);
nv_math::mat4f tempMatrix;
const float r2d = 180 / (3.14159265359);
static float xTheta(0.0f);
for (uint32_t i = 0; i < m_instance_count; ++i){
size_t pointerOffset = (sizeof(VkeNodeUniform) * cnt) + (64 * i);
nv_math::mat4f *matPtr = (nv_math::mat4f*)(((uint8_t*)m_uniforms_local) + pointerOffset);
m_flight_paths[i]->update(matPtr, sTime);
}
m_node_data->update((VkeNodeUniform*)m_uniforms_local, m_instance_count);
m_camera->setViewport(0, 0, (float)m_width, (float)m_height);
m_camera->update();
generateDrawCommands();
if (!m_is_first_frame){
vkResetFences(device->getVKDevice(), 1, &m_update_fence[m_current_buffer_index]);
const VkPipelineStageFlags waitStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
VkSubmitInfo subInfo = { VK_STRUCTURE_TYPE_SUBMIT_INFO };
subInfo.commandBufferCount = 1;
subInfo.waitSemaphoreCount = 1;
subInfo.pWaitSemaphores = &m_present_done[m_current_buffer_index];
subInfo.pWaitDstStageMask = &waitStages;
subInfo.signalSemaphoreCount = 1;
subInfo.pSignalSemaphores = &m_render_done[m_current_buffer_index];
subInfo.pCommandBuffers = &m_primary_commands[m_current_buffer_index];
vkQueueSubmit(dc->getDefaultQueue()->getVKQueue(), 1, &subInfo, m_update_fence[m_current_buffer_index]);
/*
Synchronise the next buffer.
This prevents the buffer from being reset when still in use
when we have more than 2 frames in flight.
*/
uint32_t nextBufferIndex = (m_current_buffer_index + 1) % 2;
present();
vkWaitForFences(device->getVKDevice(), 1, &m_update_fence[nextBufferIndex], VK_TRUE, 1000000);
}
else{
m_is_first_frame = false;
}
m_current_buffer_index++;
m_current_buffer_index %= 2;
sTime += 0.16;
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:71,代码来源:VkeGameRendererDynamic.cpp
示例10: initRenderer
void vkeGameRendererDynamic::initRenderer(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDevice();
m_instance_count = 128;
glWaitVkSemaphoreNV = (PFNGLWAITVKSEMAPHORENVPROC)NVPWindow::sysGetProcAddress("glWaitVkSemaphoreNV");
glSignalVkSemaphoreNV = (PFNGLSIGNALVKSEMAPHORENVPROC)NVPWindow::sysGetProcAddress("glSignalVkSemaphoreNV");
glSignalVkFenceNV = (PFNGLSIGNALVKFENCENVPROC)NVPWindow::sysGetProcAddress("glSignalVkFenceNV");
glDrawVkImageNV = (PFNGLDRAWVKIMAGENVPROC)NVPWindow::sysGetProcAddress("glDrawVkImageNV");
VkSemaphoreCreateInfo semInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO };
VkFenceCreateInfo fenceInfo = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO};
VKA_CHECK_ERROR(vkCreateSemaphore(device->getVKDevice(), &semInfo, NULL, &m_present_done[0]), "Could not create present done semaphore.\n");
VKA_CHECK_ERROR(vkCreateSemaphore(device->getVKDevice(), &semInfo, NULL, &m_render_done[0]), "Could not create render done semaphore.\n");
VKA_CHECK_ERROR(vkCreateSemaphore(device->getVKDevice(), &semInfo, NULL, &m_present_done[1]), "Could not create present done semaphore.\n");
VKA_CHECK_ERROR(vkCreateSemaphore(device->getVKDevice(), &semInfo, NULL, &m_render_done[1]), "Could not create render done semaphore.\n");
VKA_CHECK_ERROR(vkCreateFence(device->getVKDevice(), &fenceInfo, NULL, &m_update_fence[0]), "Could not create update fence.\n");
fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
VKA_CHECK_ERROR(vkCreateFence(device->getVKDevice(), &fenceInfo, NULL, &m_update_fence[1]), "Could not create update fence.\n");
m_terrain_command[0] = VK_NULL_HANDLE;
m_terrain_command[1] = VK_NULL_HANDLE;
m_framebuffers[0] = VK_NULL_HANDLE;
m_framebuffers[1] = VK_NULL_HANDLE;
m_update_commands[0] = VK_NULL_HANDLE;
m_update_commands[1] = VK_NULL_HANDLE;
m_is_first_frame = true;
nv_math::vec3f table[128][128];
for (int v = 0; v < 128; ++v){
for (int u = 0; u < 128; ++u){
nv_math::vec2f vctr(quickRandomUVD(), quickRandomUVD());
vctr = nv_math::normalize(vctr);
table[u][v] = nv_math::vec3f(vctr.x, vctr.y, vctr.x);
}
}
m_cube_textures.newTexture(1)->loadCubeDDS("environ.dds");
m_screen_quad.initQuadData();
m_terrain_quad.initQuadData();
m_textures.newTexture(0)->setFormat(VK_FORMAT_R32G32B32_SFLOAT);
m_textures.getTexture(0)->loadTextureFloatData((float *)&(table[0][0].x), 128, 128, 3);
m_flight_paths = (FlightPath**)malloc(sizeof(FlightPath*) * m_instance_count);
for (uint32_t i = 0; i < m_instance_count; ++i){
nv_math::vec2f initPos(quickRandomUVD()*100.0, -200 + (quickRandomUVD() * 20));
nv_math::vec2f endPos(quickRandomUVD()*100.0, 200 + (quickRandomUVD() * 20));
m_flight_paths[i] = new FlightPath(initPos, endPos, quickRandomUVD() * 0.5 + 0.5, quickRandomUVD() * 4 + 10);
}
/*
Just initialises the draw call objects
not the threads. They store thread local
data for the threaded cmd buffer builds.
*/
initDrawCalls();
/*
Create primary command pool for the
*/
VkCommandPoolCreateInfo cmdPoolInfo = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };
cmdPoolInfo.queueFamilyIndex = 0;
cmdPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
VKA_CHECK_ERROR(vkCreateCommandPool(device->getVKDevice(), &cmdPoolInfo, NULL, &m_primary_buffer_cmd_pool), "Could not create primary command pool.\n");
m_primary_commands[0] = VK_NULL_HANDLE;
m_primary_commands[1] = VK_NULL_HANDLE;
VkCommandBufferAllocateInfo cmdBufInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
cmdBufInfo.commandBufferCount = 2;
cmdBufInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
cmdBufInfo.commandPool = m_primary_buffer_cmd_pool;
VKA_CHECK_ERROR(vkAllocateCommandBuffers(device->getVKDevice(), &cmdBufInfo, m_primary_commands), "Could not allocate primary command buffers.\n");
VKA_CHECK_ERROR(vkAllocateCommandBuffers(device->getVKDevice(), &cmdBufInfo, m_update_commands), "Could not allocate primary command buffers.\n");
m_current_buffer_index = 0;
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:96,代码来源:VkeGameRendererDynamic.cpp
示例11: update
void vkeGameRendererDynamic::update(){
VulkanAppContext *ctxt = VulkanAppContext::GetInstance();
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VkCommandBuffer cmd = VK_NULL_HANDLE;
VulkanDC::Device::Queue::CommandBufferID cmdID = INIT_COMMAND_ID + 300;
static float sTime = 0.0f;
static uint32_t *uniforms = NULL;
uint32_t sz = (sizeof(VkeNodeUniform) * 100) + (64 * 64);
static bool ismapped(false);
nv_math::mat4f tempMatrix;
const float r2d = 180 / (3.14159265359);
static float xTheta(0.0f);
//if (!ismapped){
VKA_CHECK_ERROR(vkMapMemory(getDefaultDevice(), m_uniforms_staging, 0, sz, 0, (void **)&uniforms), "Could not map buffer memory.\n");
//ismapped = true;
//}
for (uint32_t i = 0; i < 64; ++i){
size_t pointerOffset = (sizeof(VkeNodeUniform) * 100) + (64 * i);
nv_math::mat4f *matPtr = (nv_math::mat4f*)(((uint8_t*)uniforms) + pointerOffset);
m_flight_paths[i]->update(matPtr, sTime);
}
m_node_data->update((VkeNodeUniform*)uniforms);
m_camera->setViewport(0, 0, (float)m_width, (float)m_height);
m_camera->update();
VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };
memRange.memory = m_uniforms_staging;
memRange.offset = 0;
memRange.size = sz;
vkFlushMappedMemoryRanges(device->getVKDevice(), 1, &memRange);
vkUnmapMemory(device->getVKDevice(), m_uniforms_staging);
if (!m_is_first_frame){
VkSubmitInfo subInfo;
memset(&subInfo, 0, sizeof(subInfo));
subInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
subInfo.commandBufferCount = 1;
subInfo.pCommandBuffers = &m_update_commands[m_current_buffer_index];
vkQueueSubmit(dc->getDefaultQueue()->getVKQueue(), 1, &subInfo, VK_NULL_HANDLE);
vkQueueWaitIdle(dc->getDefaultQueue()->getVKQueue());
#if defined(WIN32)
subInfo.waitSemaphoreCount = 1;
subInfo.pWaitSemaphores = &m_present_done;
subInfo.signalSemaphoreCount = 0;
subInfo.pSignalSemaphores = &m_render_done;
#endif
subInfo.pCommandBuffers = &m_primary_commands[m_current_buffer_index];
vkQueueSubmit(dc->getDefaultQueue()->getVKQueue(), 1, &subInfo, VK_NULL_HANDLE);
}
else{
m_is_first_frame = false;
}
present();
m_current_buffer_index++;
m_current_buffer_index %= 2;
sTime += 0.16;
generateDrawCommands();
}
开发者ID:LittleFox94,项目名称:gl_vk_chopper,代码行数:93,代码来源:VkeGameRendererDynamic.cpp
示例12: VKA_INFO_MSG
void VkeCubeTexture::loadTextureFiles(const char **inPath){
bool imagesOK = true;
VKA_INFO_MSG("Loading Cube Texture.\n");
for (uint32_t i = 0; i < 6; ++i){
if (!loadTexture(inPath[i], NULL, NULL, &m_width, &m_height)){
VKA_ERROR_MSG("Error loading texture image.\n");
printf("Texture : %d not available (%s).\n", i, inPath[i]);
return;
}
}
VulkanDC::Device::Queue::Name queueName = "DEFAULT_GRAPHICS_QUEUE";
VulkanDC::Device::Queue::CommandBufferID cmdID = INIT_COMMAND_ID;
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VulkanDC::Device::Queue *queue = device->getQueue(queueName);
VkCommandBuffer cmd = VK_NULL_HANDLE;
queue->beginCommandBuffer(cmdID, &cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
imageCreateAndBind(
&m_data.image,
&m_data.memory,
m_format, VK_IMAGE_TYPE_2D,
m_width, m_height, 1, 6,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
(VkImageUsageFlagBits)( VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT ),
VK_IMAGE_TILING_OPTIMAL);
VkBuffer cubeMapBuffer;
VkDeviceMemory cubeMapMem;
bufferCreate(&cubeMapBuffer, m_width*m_height * 4 * 6, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
bufferAlloc(&cubeMapBuffer, &cubeMapMem, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
VkDeviceSize dSize = m_width * m_height * 4;
uint32_t rowPitch = m_width * 4;
if (m_memory_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT){
imageSetLayoutBarrier(cmdID, queueName, m_data.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_GENERAL);
for (uint32_t i = 0; i < 6; ++i){
void *data = NULL;
VkDeviceSize ofst = dSize*i;
VKA_CHECK_ERROR(vkMapMemory(getDefaultDevice(),cubeMapMem, ofst, dSize, 0, &data), "Could not map memory for image.\n");
if (!loadTexture(inPath[i], (uint8_t**)&data, rowPitch, &m_width, &m_height)){
VKA_ERROR_MSG("Could not load final image.\n");
}
vkUnmapMemory(getDefaultDevice(), cubeMapMem);
}
VkBufferImageCopy biCpyRgn[6];
for (uint32_t k = 0; k < 6; ++k){
VkDeviceSize ofst = dSize*k;
biCpyRgn[k].bufferOffset = ofst;
biCpyRgn[k].bufferImageHeight = 0;
biCpyRgn[k].bufferRowLength = 0;
biCpyRgn[k].imageExtent.width = m_width;
biCpyRgn[k].imageExtent.height = m_height;
biCpyRgn[k].imageExtent.depth = 1;
biCpyRgn[k].imageOffset.x = 0;
biCpyRgn[k].imageOffset.y = 0;
biCpyRgn[k].imageOffset.z = 0;
biCpyRgn[k].imageSubresource.baseArrayLayer = k;
biCpyRgn[k].imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
biCpyRgn[k].imageSubresource.layerCount = 1;
biCpyRgn[k].imageSubresource.mipLevel = 0;
}
VkFence copyFence;
VkFenceCreateInfo fenceInfo;
memset(&fenceInfo, 0, sizeof(fenceInfo));
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
vkCreateFence(device->getVKDevice(), &fenceInfo,NULL , ©Fence);
vkCmdCopyBufferToImage(cmd, cubeMapBuffer, m_data.image, m_data.imageLayout, 6, biCpyRgn);
queue->flushCommandBuffer(cmdID , ©Fence);
vkWaitForFences(device->getVKDevice(), 1, ©Fence, VK_TRUE, 100000000000);
vkDestroyBuffer(device->getVKDevice(), cubeMapBuffer, NULL);
vkFreeMemory(device->getVKDevice(), cubeMapMem, NULL);
}
VkSamplerCreateInfo sampler;
sampler.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
//.........这里部分代码省略.........
开发者ID:LittleFox94,项目名称:gl_vk_chopper,代码行数:101,代码来源:VkeCubeTexture.cpp
示例13: generateDrawCommands
void vkeGameRendererDynamic::generateDrawCommands(){
//Start generating draw commands.
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VkClearValue clearValues[3];
colorClearValues(&clearValues[0], 1.0, 1.0, 1.0);
depthStencilClearValues(&clearValues[1]);//default#
colorClearValues(&clearValues[2], 0.0, 0.0, 0.0);
/*
Dispatch threads to create the secondary
command buffers.
*/
m_calls_generated = 0;
for (uint32_t i = 0; i < m_max_draw_calls; ++i){
m_draw_calls[i]->initDrawCommands(m_node_data->count(), m_current_buffer_index);
}
/*
Begin setting up the primary command buffer.
*/
VkCommandBufferBeginInfo cmdBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
VKA_CHECK_ERROR(vkResetCommandBuffer(m_primary_commands[m_current_buffer_index], 0),"Could not reset primary command buffer");
VKA_CHECK_ERROR(vkBeginCommandBuffer(m_primary_commands[m_current_buffer_index], &cmdBeginInfo), "Could not begin primary command buffer.\n");
uint32_t cnt = m_node_data->count();
VkDeviceSize sz = (sizeof(VkeNodeUniform) * cnt) + (m_instance_count * 64);
vkCmdUpdateBuffer(m_primary_commands[m_current_buffer_index], m_uniforms_buffer, 0, sz, (const uint32_t *)m_uniforms_local);
m_camera->updateCameraCmd(m_primary_commands[m_current_buffer_index]);
renderPassBegin(&m_primary_commands[m_current_buffer_index], m_render_pass, m_framebuffers[m_current_buffer_index], 0, 0, m_width, m_height, clearValues, 3, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
VkViewport vp;
VkRect2D sc;
vp.x = 0;
vp.y = 0;
vp.height = (float)(m_height);
vp.width = (float)(m_width);
vp.minDepth = 0.0f;
vp.maxDepth = 1.0f;
sc.offset.x = 0;
sc.offset.y = 0;
sc.extent.width = vp.width;
sc.extent.height = vp.height;
vkCmdSetViewport(m_primary_commands[m_current_buffer_index], 0, 1, &vp);
vkCmdSetScissor(m_primary_commands[m_current_buffer_index], 0, 1, &sc);
/*
Wait here until the secondary commands are ready.
*/
VkCommandBuffer secondaryCommands[11];
secondaryCommands[0] = m_terrain_command[m_current_buffer_index];
for (uint32_t i = 0; i < m_max_draw_calls; ++i){
secondaryCommands[i+1] = m_draw_calls[i]->getDrawCommand(m_current_buffer_index);
}
vkCmdExecuteCommands(m_primary_commands[m_current_buffer_index], 1+m_max_draw_calls, secondaryCommands);
vkCmdEndRenderPass(m_primary_commands[m_current_buffer_index]);
VkImageResolve blitInfo;
blitInfo.srcOffset.x = 0;
blitInfo.srcOffset.y = 0;
blitInfo.srcOffset.z = 0;
blitInfo.dstOffset.x = 0;
blitInfo.dstOffset.y = 0;
blitInfo.dstOffset.z = 0;
blitInfo.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
blitInfo.srcSubresource.mipLevel = 0;
blitInfo.srcSubresource.baseArrayLayer = 0;
blitInfo.srcSubresource.layerCount = 1;
blitInfo.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
blitInfo.dstSubresource.mipLevel = 0;
blitInfo.dstSubresource.baseArrayLayer = 0;
blitInfo.dstSubresource.layerCount = 1;
blitInfo.extent.width = m_width;
blitInfo.extent.height = m_height;
blitInfo.extent.depth = 1;
vkCmdResolveImage(
m_primary_commands[m_current_buffer_index],
m_color_attachment.image,
VK_IMAGE_LAYOUT_GENERAL,
m_resolve_attachment[m_current_buffer_index].image,
VK_IMAGE_LAYOUT_GENERAL,
1,
&blitInfo);
//.........这里部分代码省略.........
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:101,代码来源:VkeGameRendererDynamic.cpp
示例14: initFramebuffer
void vkeGameRendererDynamic::initFramebuffer(uint32_t inWidth, uint32_t inHeight){
/*----------------------------------------------------------
Create the framebuffer
----------------------------------------------------------*/
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VulkanDC::Device::Queue *queue = dc->getDefaultQueue();
const VkFormat depthFmt = VK_FORMAT_D24_UNORM_S8_UINT;
const VkFormat colorFmt = VK_FORMAT_R8G8B8A8_UNORM;
/*
If framebuffers already exist, release them.
*/
if (m_framebuffers[0] != VK_NULL_HANDLE){
releaseFramebuffer();
}
/*
Update the frame dimensions.
*/
m_width = inWidth;
m_height = inHeight;
/*
Specify usage for the frame buffer attachments.
*/
VkImageUsageFlagBits gBufferFlags = (VkImageUsageFlagBits)(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
VkImageUsageFlagBits sBufferFlags = (VkImageUsageFlagBits)(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
/*
Create the depth attachment image and image view.
*/
m_depth_attachment.format = depthFmt;
imageCreateAndBind(&m_depth_attachment.image, &m_depth_attachment.memory, depthFmt, VK_IMAGE_TYPE_2D, m_width, m_height, 1, 1, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, getSamples());
imageViewCreate(&m_depth_attachment.view, m_depth_attachment.image, VK_IMAGE_VIEW_TYPE_2D, depthFmt);
/*
Create the color attachment image and image view.
*/
m_color_attachment.format = colorFmt;
imageCreateAndBind(&m_color_attachment.image, &m_color_attachment.memory, colorFmt, VK_IMAGE_TYPE_2D, m_width, m_height, 1, 1, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, gBufferFlags, VK_IMAGE_TILING_OPTIMAL, getSamples());
imageViewCreate(&m_color_attachment.view, m_color_attachment.image, VK_IMAGE_VIEW_TYPE_2D, colorFmt);
/*
Create the resolve attachment image and image view.
*/
for (uint32_t i = 0; i < 2; ++i){
m_resolve_attachment[i].format = colorFmt;
imageCreateAndBind(&m_resolve_attachment[i].image, &m_resolve_attachment[i].memory, colorFmt, VK_IMAGE_TYPE_2D, m_width, m_height, 1, 1, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, gBufferFlags, VK_IMAGE_TILING_OPTIMAL, VK_SAMPLE_COUNT_1_BIT);
imageViewCreate(&m_resolve_attachment[i].view, m_resolve_attachment[i].image, VK_IMAGE_VIEW_TYPE_2D, colorFmt);
}
/*
Put the image views into a temporary array
to pass to the framebuffer create info struct.
*/
/*
Setup the framebuffer create info struct.
*/
for (uint32_t i = 0; i < 2; ++i){
VkImageView views[] = { m_color_attachment.view, m_depth_attachment.view, m_resolve_attachment[i].view };
VkFramebufferCreateInfo fbInfo = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO };
fbInfo.renderPass = m_render_pass;
fbInfo.attachmentCount = 3;
fbInfo.pAttachments = views;
fbInfo.width = m_width;
fbInfo.height = m_height;
fbInfo.layers = 1;
/*
Create 2 framebuffers for ping pong.
*/
VKA_CHECK_ERROR(vkCreateFramebuffer(device->getVKDevice(), &fbInfo, NULL, &m_framebuffers[i]), "Could not create framebuffer.\n");
}
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:80,代码来源:VkeGameRendererDynamic.cpp
示例15: initPipeline
void vkeGameRendererDynamic::initPipeline(){
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VkPipelineCacheCreateInfo pipelineCache = { VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO };
VkPipelineVertexInputStateCreateInfo vertexState;
VkPipelineInputAssemblyStateCreateInfo inputState;
VkPipelineRasterizationStateCreateInfo rasterState;
VkPipelineColorBlendStateCreateInfo blendState;
VkPipelineDepthStencilStateCreateInfo depthState;
VkPipelineViewportStateCreateInfo viewportState;
VkPipelineMultisampleStateCreateInfo multisampleState;
VkVertexInputBindingDescription binding;
VkVertexInputAttributeDescription attrs[3];
/*----------------------------------------------------------
Create the pipeline cache.
----------------------------------------------------------*/
VKA_CHECK_ERROR(vkCreatePipelineCache(device->getVKDevice(), &pipelineCache, NULL, &m_pipeline_cache), "Couldn not create pipeline cache.\n");
/*----------------------------------------------------------
Create the scene pipeline.
----------------------------------------------------------*/
/*
Create the vertex input state.
Binding at location 0.
3 attributes:
1 : Vertex Position : vec4
2 : Vertex Normal : vec4
3 : UV : vec2
*/
vertexBinding(&binding, 0, sizeof(VertexObject), VK_VERTEX_INPUT_RATE_VERTEX);
vertexAttributef(&attrs[0], 0, binding.binding, VK_FORMAT_R32G32B32A32_SFLOAT, 0);
vertexAttributef(&attrs[1], 1, binding.binding, VK_FORMAT_R32G32B32A32_SFLOAT, 4);
vertexStateInfo(&vertexState, 1, 2, &binding, attrs);
/*
Create the input assembly state
Topology: Triangle List
Primitive restart enable : false
*/
inputAssemblyStateInfo(&inputState, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_FALSE);
/*
Create the raster state
*/
rasterStateInfo(&rasterState, VK_POLYGON_MODE_FILL);
/*
Create the color blend state.
*/
VkPipelineColorBlendAttachmentState attState[3];
uint32_t sampleMask = 0xFF;
blendAttachmentStateN(3, attState);
blendStateInfo(&blendState, 3, attState);
/*
Create the viewport state
*/
viewportStateInfo(&viewportState, 1);
/*
Create the depth stencil state
*/
depthStateInfo(&depthState);
/*
Create the multisample state
*/
multisampleStateInfo(&multisampleState, getSamples(), &sampleMask);
/*
Create the pipeline shaders.
*/
VkPipelineShaderStageCreateInfo shaderStages[4];
createShaderStage(&shaderStages[0], VK_SHADER_STAGE_VERTEX_BIT, m_shaders.scene_vertex);
createShaderStage(&shaderStages[1], VK_SHADER_STAGE_FRAGMENT_BIT, m_shaders.scene_fragment);
/*
Create the graphics pipeline.
*/
graphicsPipelineCreate(&m_pipeline, &m_pipeline_cache, m_pipeline_layout, 2, shaderStages, &vertexState, &inputState, &rasterState, &blendState, &multisampleState, &viewportState, &depthState, &m_render_pass, 0, VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT);
/*----------------------------------------------------------
Create the skybox pipeline.
----------------------------------------------------------*/
/*
Reusing the create info struct from
the scene pipeline, just update what
we need.
*/
vertexBinding(&binding, 0, sizeof(VertexObjectUV), VK_VERTEX_INPUT_RATE_VERTEX);
vertexAttributef(&attrs[0], 0, binding.binding, VK_FORMAT_R32G32B32A32_SFLOAT, 0);
vertexAttributef(&attrs[1], 1, binding.binding, VK_FORMAT_R32G32_SFLOAT, 4);
vertexStateInfo(&vertexState, 1, 2, &binding, attrs);
//.........这里部分代码省略.........
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:101,代码来源:VkeGameRendererDynamic.cpp
示例16: initIndirectCommands
void vkeGameRendererDynamic::initIndirectCommands(){
if (!m_node_data) return;
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VulkanDC::Device::Queue *queue = dc->getDefaultQueue();
uint32_t cnt = m_node_data->count();
uint32_t sz = sizeof(VkDrawIndexedIndirectCommand)*cnt;
VkBuffer sceneIndirectStaging;
VkDeviceMemory sceneIndirectMemStaging;
VkBufferUsageFlags usageFlags = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
bufferCreate(&m_scene_indirect_buffer, sz, (VkBufferUsageFlagBits)usageFlags);
bufferAlloc(&m_scene_indirect_buffer, &m_scene_indirect_memory, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
usageFlags = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
bufferCreate(&sceneIndirectStaging, sz, (VkBufferUsageFlagBits)usageFlags);
bufferAlloc(&sceneIndirectStaging, &sceneIndirectMemStaging, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
VkDrawIndexedIndirectCommand *commands = NULL;
VKA_CHECK_ERROR(vkMapMemory(device->getVKDevice(), sceneIndirectMemStaging, 0, sz, 0, (void **)&commands), "Could not map indirect buffer memory.\n");
for (uint32_t i = 0; i < cnt; ++i){
VkeMesh *mesh = m_node_data->getData(i)->getMesh();
commands[i].firstIndex = mesh->getFirstIndex();
commands[i].firstInstance = i*m_instance_count;
commands[i].vertexOffset = mesh->getFirstVertex();
commands[i].indexCount = mesh->getIndexCount();
commands[i].instanceCount = m_instance_count;
}
vkUnmapMemory(device->getVKDevice(), sceneIndirectMemStaging);
VkBufferCopy bufCpy;
bufCpy.dstOffset = 0;
bufCpy.srcOffset = 0;
bufCpy.size = sz;
VkCommandBuffer copyCmd;
VkCommandBufferAllocateInfo cmdBufInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
cmdBufInfo.commandBufferCount = 1;
cmdBufInfo.commandPool = queue->getCommandPool();
cmdBufInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
VKA_CHECK_ERROR(vkAllocateCommandBuffers(device->getVKDevice(), &cmdBufInfo, ©Cmd), "Could not allocate command buffers.\n");
VkCommandBufferBeginInfo cmdBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
VKA_CHECK_ERROR(vkBeginCommandBuffer(copyCmd, &cmdBeginInfo), "Could not begin commmand buffer.\n");
vkCmdCopyBuffer(copyCmd, sceneIndirectStaging, m_scene_indirect_buffer, 1, &bufCpy);
VKA_CHECK_ERROR(vkEndCommandBuffer(copyCmd), "Could not end command buffer.\n");
VkSubmitInfo subInfo = { VK_STRUCTURE_TYPE_SUBMIT_INFO };
subInfo.commandBufferCount = 1;
subInfo.pCommandBuffers = ©Cmd;
VkFence theFence;
VkFenceCreateInfo fenceInfo = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO };
VKA_CHECK_ERROR(vkCreateFence(device->getVKDevice(), &fenceInfo, NULL, &theFence), "Could not create fence.\n");
VKA_CHECK_ERROR(vkQueueSubmit(queue->getVKQueue(), 1, &subInfo, theFence), "Could not submit queue for indirect buffer copy.\n");
VKA_CHECK_ERROR(vkWaitForFences(device->getVKDevice(), 1, &theFence, VK_TRUE, UINT_MAX), "Could not wait for fence.\n");
vkFreeCommandBuffers(device->getVKDevice(), queue->getCommandPool(), 1, ©Cmd);
vkDestroyFence(device->getVKDevice(), theFence, NULL);
}
开发者ID:brdf,项目名称:gl_vk_chopper,代码行数:76,代码来源:VkeGameRendererDynamic.cpp
示例17: perror
void VkeCubeTexture::loadCubeDDS(const char *inFile){
std::string searchPaths[] = {
std::string(PROJECT_NAME),
NVPWindow::sysExePath() + std::string(PROJECT_RELDIRECTORY),
std::string(PROJECT_ABSDIRECTORY)
};
nv_dds::CDDSImage ddsImage;
for (uint32_t i = 0; i < 3; ++i){
std::string separator = "";
uint32_t strSize = searchPaths[i].size();
if(searchPaths[i].substr(strSize-1,strSize) != "/") separator = "/";
std::string filePath = searchPaths[i] + separator + std::string("images/") + std::string(inFile);
ddsImage.load(filePath, true);
if (ddsImage.is_valid()) break;
}
if (!ddsImage.is_valid()){
perror("Could not cube load texture image.\n");
exit(1);
}
uint32_t imgW = ddsImage.get_width();
uint32_t imgH = ddsImage.get_height();
uint32_t comCount = ddsImage.get_components();
uint32_t fmt = ddsImage.get_format();
bool isCube = ddsImage.is_cubemap();
bool isComp = ddsImage.is_compressed();
VkFormat vkFmt = VK_FORMAT_R8G8B8A8_UNORM;
switch (fmt){
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
vkFmt = VK_FORMAT_BC1_RGB_SRGB_BLOCK;
break;
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
vkFmt = VK_FORMAT_BC2_UNORM_BLOCK;
break;
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
vkFmt = VK_FORMAT_BC3_UNORM_BLOCK;
break;
default:
break;
}
m_width = imgW;
m_height = imgH;
m_format = vkFmt;
VulkanDC::Device::Queue::Name queueName = "DEFAULT_GRAPHICS_QUEUE";
VulkanDC::Device::Queue::CommandBufferID cmdID = INIT_COMMAND_ID;
VulkanDC *dc = VulkanDC::Get();
VulkanDC::Device *device = dc->getDefaultDevice();
VulkanDC::Device::Queue *queue = device->getQueue(queueName);
VkCommandBuffer cmd = VK_NULL_HANDLE;
queue->beginCommandBuffer(cmdID, &cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
imageCreateAndBind(
&m_data.image,
&m_data.memory,
m_format, VK_IMAGE_TYPE_2D,
m_width, m_height, 1, 6,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
(VkImageUsageFlagBits)(VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
VK_IMAGE_TILING_OPTIMAL);
VkBuffer cubeMapBuffer;
VkDeviceMemory cubeMapMem;
bufferCreate(&cubeMapBuffer, m_width*m_height * 3 * 6, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
bufferAlloc(&cubeMapBuffer, &cubeMapMem, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
if (m_memory_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT){
imageSetLayoutBarrier(cmdID, queueName, m_data.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_GENERAL);
for (uint32_t i = 0; i < 6; ++i){
void *data = NULL;
VkSubresourceLayout layout;
VkImageSubresource subres;
subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
subres.mipLevel = m_mip_level;
subres.arrayLayer = i;
vkGetImageSubresourceLayout(getDefaultDevice(), m_data.image, &subres, &layout);
VKA_CHECK_ERROR(vkMapMemory(getDefaultDevice(), cubeMapMem, layout.offset, layout.size, 0, &data), "Could not map memory for image.\n");
const nv_dds::CTexture &mipmap = ddsImage.get_cubemap_face(i);
//.........这里部分代码省略.........
开发者ID:LittleFox94,项目名称:gl_vk_chopper,代码行数:101,代码来源:VkeCube |
请发表评论