diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer_vk.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/renderer_vk.cpp | 368 |
1 files changed, 162 insertions, 206 deletions
diff --git a/3rdparty/bgfx/src/renderer_vk.cpp b/3rdparty/bgfx/src/renderer_vk.cpp index 8e2f66c513f..5468aebc6a7 100644 --- a/3rdparty/bgfx/src/renderer_vk.cpp +++ b/3rdparty/bgfx/src/renderer_vk.cpp @@ -209,7 +209,7 @@ VK_IMPORT_DEVICE { VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // RGBA4 { VK_FORMAT_B5G5R5A1_UNORM_PACK16, VK_FORMAT_B5G5R5A1_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // RGB5A1 { VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // RGB10A2 - { VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // R11G11B10F + { VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // RG11B10F { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED }, // UnknownDepth { VK_FORMAT_UNDEFINED, VK_FORMAT_R16_UNORM, VK_FORMAT_D16_UNORM, VK_FORMAT_UNDEFINED }, // D16 { VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_UNDEFINED }, // D24 @@ -332,7 +332,7 @@ VK_IMPORT_DEVICE return; } - bx::alignedFree(g_allocator, _memory, BX_CONFIG_ALLOCATOR_NATURAL_ALIGNMENT); + bx::alignedFree(g_allocator, _memory, 8); } static void VKAPI_PTR internalAllocationNotification(void* _userData, size_t _size, VkInternalAllocationType _allocationType, VkSystemAllocationScope _allocationScope) @@ -725,7 +725,7 @@ VK_IMPORT_DEVICE ErrorState::Enum errorState = ErrorState::Default; - m_fbh.idx = invalidHandle; + m_fbh.idx = kInvalidHandle; bx::memSet(m_uniforms, 0, sizeof(m_uniforms) ); bx::memSet(&m_resolution, 0, sizeof(m_resolution) ); @@ -747,7 +747,7 @@ VK_IMPORT_DEVICE if (NULL == m_vulkan1dll) { - BX_TRACE("Failed to load vulkan dynamic library."); + BX_TRACE("Init error: Failed to load vulkan dynamic library."); goto error; } @@ -763,7 +763,7 @@ VK_IMPORT if (!imported) { - BX_TRACE("Failed to load shared library functions."); + BX_TRACE("Init error: Failed to load shared library functions."); goto error; } @@ -831,7 +831,7 @@ VK_IMPORT if (VK_SUCCESS != result) { - BX_TRACE("vkCreateInstance failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateInstance failed %d: %s.", result, getName(result) ); goto error; } @@ -847,7 +847,7 @@ VK_IMPORT_INSTANCE if (!imported) { - BX_TRACE("Failed to load instance functions."); + BX_TRACE("Init error: Failed to load instance functions."); goto error; } @@ -882,7 +882,7 @@ VK_IMPORT_INSTANCE if (VK_SUCCESS != result) { - BX_TRACE("vkEnumeratePhysicalDevices failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkEnumeratePhysicalDevices failed %d: %s.", result, getName(result) ); goto error; } @@ -895,7 +895,7 @@ VK_IMPORT_INSTANCE if (VK_SUCCESS != result) { - BX_TRACE("vkEnumeratePhysicalDevices failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkEnumeratePhysicalDevices failed %d: %s.", result, getName(result) ); goto error; } @@ -961,6 +961,8 @@ VK_IMPORT_INSTANCE g_caps.vendorId = uint16_t(m_deviceProperties.vendorID); g_caps.deviceId = uint16_t(m_deviceProperties.deviceID); + g_caps.limits.maxTextureSize = m_deviceProperties.limits.maxImageDimension2D; + g_caps.limits.maxFBAttachments = uint8_t(bx::uint32_min(m_deviceProperties.limits.maxFragmentOutputAttachments, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) ); { // VkFormatProperties fp; @@ -986,7 +988,7 @@ VK_IMPORT_INSTANCE { uint8_t support = BGFX_CAPS_FORMAT_TEXTURE_NONE; - const bool depth = isDepth(TextureFormat::Enum(ii) ); + const bool depth = bimg::isDepth(bimg::TextureFormat::Enum(ii) ); VkFormat fmt = depth ? s_textureFormat[ii].m_fmtDsv : s_textureFormat[ii].m_fmt @@ -1086,7 +1088,7 @@ VK_IMPORT_INSTANCE if (UINT32_MAX == m_qfiGraphics) { - BX_TRACE("Unable to find graphics queue."); + BX_TRACE("Init error: Unable to find graphics queue."); goto error; } } @@ -1145,7 +1147,7 @@ VK_IMPORT_INSTANCE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateDevice failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateDevice failed %d: %s.", result, getName(result) ); goto error; } } @@ -1162,7 +1164,7 @@ VK_IMPORT_DEVICE if (!imported) { - BX_TRACE("Failed to load device functions."); + BX_TRACE("Init error: Failed to load device functions."); goto error; } @@ -1171,7 +1173,7 @@ VK_IMPORT_DEVICE m_backBufferDepthStencilFormat = VK_FORMAT_D32_SFLOAT_S8_UINT - // VK_FORMAT_D24_UNORM_S8_UINT +// VK_FORMAT_D24_UNORM_S8_UINT ; { @@ -1236,7 +1238,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateRenderPass failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateRenderPass failed %d: %s.", result, getName(result) ); goto error; } } @@ -1296,7 +1298,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateSurfaceKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateSurfaceKHR failed %d: %s.", result, getName(result) ); goto error; } @@ -1308,7 +1310,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkGetPhysicalDeviceSurfaceSupportKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkGetPhysicalDeviceSurfaceSupportKHR failed %d: %s.", result, getName(result) ); goto error; } @@ -1317,7 +1319,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkGetPhysicalDeviceSurfaceCapabilitiesKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkGetPhysicalDeviceSurfaceCapabilitiesKHR failed %d: %s.", result, getName(result) ); goto error; } @@ -1326,7 +1328,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkGetPhysicalDeviceSurfaceFormatsKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkGetPhysicalDeviceSurfaceFormatsKHR failed %d: %s.", result, getName(result) ); goto error; } @@ -1341,7 +1343,7 @@ VK_IMPORT_DEVICE result = vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &numPresentModes, NULL); if (VK_SUCCESS != result) { - BX_TRACE("vkGetPhysicalDeviceSurfacePresentModesKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkGetPhysicalDeviceSurfacePresentModesKHR failed %d: %s.", result, getName(result) ); goto error; } @@ -1375,7 +1377,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateSwapchainKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateSwapchainKHR failed %d: %s.", result, getName(result) ); goto error; } @@ -1384,13 +1386,13 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkGetSwapchainImagesKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkGetSwapchainImagesKHR failed %d: %s.", result, getName(result) ); goto error; } if (numSwapchainImages < m_sci.minImageCount) { - BX_TRACE("vkGetSwapchainImagesKHR: numSwapchainImages %d, minImageCount %d." + BX_TRACE("Init error: vkGetSwapchainImagesKHR: numSwapchainImages %d, minImageCount %d." , numSwapchainImages , m_sci.minImageCount ); @@ -1402,7 +1404,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkGetSwapchainImagesKHR failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkGetSwapchainImagesKHR failed %d: %s.", result, getName(result) ); goto error; } @@ -1437,7 +1439,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateImage failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateImage failed %d: %s.", result, getName(result) ); goto error; } @@ -1459,7 +1461,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkAllocateMemory failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkAllocateMemory failed %d: %s.", result, getName(result) ); goto error; } @@ -1467,7 +1469,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkBindImageMemory failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkBindImageMemory failed %d: %s.", result, getName(result) ); goto error; } @@ -1494,7 +1496,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateImageView failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateImageView failed %d: %s.", result, getName(result) ); goto error; } @@ -1542,7 +1544,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateImageView failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateImageView failed %d: %s.", result, getName(result) ); goto error; } @@ -1551,7 +1553,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateFramebuffer failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateFramebuffer failed %d: %s.", result, getName(result) ); goto error; } @@ -1559,7 +1561,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateSemaphore failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateSemaphore failed %d: %s.", result, getName(result) ); goto error; } @@ -1578,7 +1580,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateFence failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateFence failed %d: %s.", result, getName(result) ); goto error; } @@ -1592,7 +1594,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { vkDestroy(m_fence); - BX_TRACE("vkCreateCommandPool failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateCommandPool failed %d: %s.", result, getName(result) ); goto error; } @@ -1609,7 +1611,7 @@ VK_IMPORT_DEVICE { vkDestroy(m_commandPool); vkDestroy(m_fence); - BX_TRACE("vkAllocateCommandBuffers failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkAllocateCommandBuffers failed %d: %s.", result, getName(result) ); goto error; } @@ -1695,7 +1697,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateDescriptorPool failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateDescriptorPool failed %d: %s.", result, getName(result) ); goto error; } @@ -1709,7 +1711,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreateDescriptorSetLayout failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreateDescriptorSetLayout failed %d: %s.", result, getName(result) ); goto error; } @@ -1725,7 +1727,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreatePipelineLayout failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreatePipelineLayout failed %d: %s.", result, getName(result) ); goto error; } @@ -1739,7 +1741,7 @@ VK_IMPORT_DEVICE if (VK_SUCCESS != result) { - BX_TRACE("vkCreatePipelineCache failed %d: %s.", result, getName(result) ); + BX_TRACE("Init error: vkCreatePipelineCache failed %d: %s.", result, getName(result) ); goto error; } } @@ -1909,17 +1911,22 @@ VK_IMPORT_DEVICE unloadRenderDoc(m_renderdocdll); } - RendererType::Enum getRendererType() const BX_OVERRIDE + RendererType::Enum getRendererType() const override { return RendererType::Vulkan; } - const char* getRendererName() const BX_OVERRIDE + const char* getRendererName() const override { return BGFX_RENDERER_VULKAN_NAME; } - void flip(HMD& /*_hmd*/) BX_OVERRIDE + bool isDeviceRemoved() override + { + return false; + } + + void flip(HMD& /*_hmd*/) override { if (VK_NULL_HANDLE != m_swapchain) { @@ -1936,140 +1943,140 @@ VK_IMPORT_DEVICE } } - void createIndexBuffer(IndexBufferHandle _handle, Memory* _mem, uint16_t _flags) BX_OVERRIDE + void createIndexBuffer(IndexBufferHandle _handle, Memory* _mem, uint16_t _flags) override { m_indexBuffers[_handle.idx].create(_mem->size, _mem->data, _flags, false); } - void destroyIndexBuffer(IndexBufferHandle _handle) BX_OVERRIDE + void destroyIndexBuffer(IndexBufferHandle _handle) override { m_indexBuffers[_handle.idx].destroy(); } - void createVertexDecl(VertexDeclHandle _handle, const VertexDecl& _decl) BX_OVERRIDE + void createVertexDecl(VertexDeclHandle _handle, const VertexDecl& _decl) override { VertexDecl& decl = m_vertexDecls[_handle.idx]; bx::memCopy(&decl, &_decl, sizeof(VertexDecl) ); dump(decl); } - void destroyVertexDecl(VertexDeclHandle /*_handle*/) BX_OVERRIDE + void destroyVertexDecl(VertexDeclHandle /*_handle*/) override { } - void createVertexBuffer(VertexBufferHandle _handle, Memory* _mem, VertexDeclHandle _declHandle, uint16_t _flags) BX_OVERRIDE + void createVertexBuffer(VertexBufferHandle _handle, Memory* _mem, VertexDeclHandle _declHandle, uint16_t _flags) override { m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _declHandle, _flags); } - void destroyVertexBuffer(VertexBufferHandle _handle) BX_OVERRIDE + void destroyVertexBuffer(VertexBufferHandle _handle) override { m_vertexBuffers[_handle.idx].destroy(); } - void createDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _size, uint16_t _flags) BX_OVERRIDE + void createDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _size, uint16_t _flags) override { m_indexBuffers[_handle.idx].create(_size, NULL, _flags, false); } - void updateDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) BX_OVERRIDE + void updateDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) override { BX_UNUSED(_handle, _offset, _size, _mem); // m_indexBuffers[_handle.idx].update(m_commandBuffer, _offset, bx::uint32_min(_size, _mem->size), _mem->data); } - void destroyDynamicIndexBuffer(IndexBufferHandle _handle) BX_OVERRIDE + void destroyDynamicIndexBuffer(IndexBufferHandle _handle) override { m_indexBuffers[_handle.idx].destroy(); } - void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t _flags) BX_OVERRIDE + void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t _flags) override { VertexDeclHandle decl = BGFX_INVALID_HANDLE; m_vertexBuffers[_handle.idx].create(_size, NULL, decl, _flags); } - void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) BX_OVERRIDE + void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, Memory* _mem) override { BX_UNUSED(_handle, _offset, _size, _mem); // m_vertexBuffers[_handle.idx].update(m_commandBuffer, _offset, bx::uint32_min(_size, _mem->size), _mem->data); } - void destroyDynamicVertexBuffer(VertexBufferHandle _handle) BX_OVERRIDE + void destroyDynamicVertexBuffer(VertexBufferHandle _handle) override { m_vertexBuffers[_handle.idx].destroy(); } - void createShader(ShaderHandle _handle, Memory* _mem) BX_OVERRIDE + void createShader(ShaderHandle _handle, Memory* _mem) override { m_shaders[_handle.idx].create(_mem); } - void destroyShader(ShaderHandle _handle) BX_OVERRIDE + void destroyShader(ShaderHandle _handle) override { m_shaders[_handle.idx].destroy(); } - void createProgram(ProgramHandle _handle, ShaderHandle _vsh, ShaderHandle _fsh) BX_OVERRIDE + void createProgram(ProgramHandle _handle, ShaderHandle _vsh, ShaderHandle _fsh) override { m_program[_handle.idx].create(&m_shaders[_vsh.idx], isValid(_fsh) ? &m_shaders[_fsh.idx] : NULL); } - void destroyProgram(ProgramHandle _handle) BX_OVERRIDE + void destroyProgram(ProgramHandle _handle) override { m_program[_handle.idx].destroy(); } - void createTexture(TextureHandle /*_handle*/, Memory* /*_mem*/, uint32_t /*_flags*/, uint8_t /*_skip*/) BX_OVERRIDE + void createTexture(TextureHandle /*_handle*/, Memory* /*_mem*/, uint32_t /*_flags*/, uint8_t /*_skip*/) override { } - void updateTextureBegin(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/) BX_OVERRIDE + void updateTextureBegin(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/) override { } - void updateTexture(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/, const Rect& /*_rect*/, uint16_t /*_z*/, uint16_t /*_depth*/, uint16_t /*_pitch*/, const Memory* /*_mem*/) BX_OVERRIDE + void updateTexture(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/, const Rect& /*_rect*/, uint16_t /*_z*/, uint16_t /*_depth*/, uint16_t /*_pitch*/, const Memory* /*_mem*/) override { } - void updateTextureEnd() BX_OVERRIDE + void updateTextureEnd() override { } - void readTexture(TextureHandle /*_handle*/, void* /*_data*/, uint8_t /*_mip*/) BX_OVERRIDE + void readTexture(TextureHandle /*_handle*/, void* /*_data*/, uint8_t /*_mip*/) override { } - void resizeTexture(TextureHandle /*_handle*/, uint16_t /*_width*/, uint16_t /*_height*/, uint8_t /*_numMips*/) BX_OVERRIDE + void resizeTexture(TextureHandle /*_handle*/, uint16_t /*_width*/, uint16_t /*_height*/, uint8_t /*_numMips*/) override { } - void overrideInternal(TextureHandle /*_handle*/, uintptr_t /*_ptr*/) BX_OVERRIDE + void overrideInternal(TextureHandle /*_handle*/, uintptr_t /*_ptr*/) override { } - uintptr_t getInternal(TextureHandle /*_handle*/) BX_OVERRIDE + uintptr_t getInternal(TextureHandle /*_handle*/) override { return 0; } - void destroyTexture(TextureHandle /*_handle*/) BX_OVERRIDE + void destroyTexture(TextureHandle /*_handle*/) override { } - void createFrameBuffer(FrameBufferHandle /*_handle*/, uint8_t /*_num*/, const Attachment* /*_attachment*/) BX_OVERRIDE + void createFrameBuffer(FrameBufferHandle /*_handle*/, uint8_t /*_num*/, const Attachment* /*_attachment*/) override { } - void createFrameBuffer(FrameBufferHandle /*_handle*/, void* /*_nwh*/, uint32_t /*_width*/, uint32_t /*_height*/, TextureFormat::Enum /*_depthFormat*/) BX_OVERRIDE + void createFrameBuffer(FrameBufferHandle /*_handle*/, void* /*_nwh*/, uint32_t /*_width*/, uint32_t /*_height*/, TextureFormat::Enum /*_depthFormat*/) override { } - void destroyFrameBuffer(FrameBufferHandle /*_handle*/) BX_OVERRIDE + void destroyFrameBuffer(FrameBufferHandle /*_handle*/) override { } - void createUniform(UniformHandle _handle, UniformType::Enum _type, uint16_t _num, const char* _name) BX_OVERRIDE + void createUniform(UniformHandle _handle, UniformType::Enum _type, uint16_t _num, const char* _name) override { if (NULL != m_uniforms[_handle.idx]) { @@ -2083,45 +2090,52 @@ VK_IMPORT_DEVICE m_uniformReg.add(_handle, _name, data); } - void destroyUniform(UniformHandle _handle) BX_OVERRIDE + void destroyUniform(UniformHandle _handle) override { BX_FREE(g_allocator, m_uniforms[_handle.idx]); m_uniforms[_handle.idx] = NULL; } - void requestScreenShot(FrameBufferHandle /*_handle*/, const char* /*_filePath*/) BX_OVERRIDE + void requestScreenShot(FrameBufferHandle /*_handle*/, const char* /*_filePath*/) override { } - void updateViewName(uint8_t _id, const char* _name) BX_OVERRIDE + void updateViewName(ViewId _id, const char* _name) override { - bx::strlcpy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , _name + bx::strCopy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] , BX_COUNTOF(s_viewName[0]) - BGFX_CONFIG_MAX_VIEW_NAME_RESERVED + , _name ); } - void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) BX_OVERRIDE + void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) override { bx::memCopy(m_uniforms[_loc], _data, _size); } - void setMarker(const char* /*_marker*/, uint32_t /*_size*/) BX_OVERRIDE + void setMarker(const char* /*_marker*/, uint32_t /*_size*/) override { } - void invalidateOcclusionQuery(OcclusionQueryHandle _handle) BX_OVERRIDE + void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { BX_UNUSED(_handle); } - void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE; + virtual void setName(Handle _handle, const char* _name) override + { + BX_UNUSED(_handle, _name) + } + + void submitBlit(BlitState& _bs, uint16_t _view); + + void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override; - void blitSetup(TextVideoMemBlitter& /*_blitter*/) BX_OVERRIDE + void blitSetup(TextVideoMemBlitter& /*_blitter*/) override { } - void blitRender(TextVideoMemBlitter& /*_blitter*/, uint32_t /*_numIndices*/) BX_OVERRIDE + void blitRender(TextVideoMemBlitter& /*_blitter*/, uint32_t /*_numIndices*/) override { } @@ -3492,18 +3506,18 @@ VK_DESTROY } } - uint16_t shaderSize; + uint32_t shaderSize; bx::read(&reader, shaderSize); #if 1 const void* code = reader.getDataPtr(); bx::skip(&reader, shaderSize+1); - m_code = alloc( ( (shaderSize+3)/4)*4); + m_code = alloc( ( ( (shaderSize+3)/4)*4) ); bx::memSet(m_code->data, 0, m_code->size); bx::memCopy(m_code->data , code - , shaderSize+1 + , shaderSize ); #else #include "../examples/runtime/shaders/spv/vert.spv.h" @@ -3528,7 +3542,12 @@ VK_DESTROY smci.flags = 0; smci.codeSize = m_code->size; smci.pCode = (const uint32_t*)m_code->data; - VK_CHECK(vkCreateShaderModule(s_renderVK->m_device, &smci, s_renderVK->m_allocatorCb, &m_module) ); + VK_CHECK(vkCreateShaderModule( + s_renderVK->m_device + , &smci + , s_renderVK->m_allocatorCb + , &m_module + ) ); bx::memSet(m_attrMask, 0, sizeof(m_attrMask) ); m_attrMask[Attrib::Position] = UINT16_MAX; @@ -3605,13 +3624,22 @@ VK_DESTROY { } + void RendererContextVK::submitBlit(BlitState& _bs, uint16_t _view) + { + while (_bs.hasItem(_view) ) + { + const BlitItem& blit = _bs.advance(); + BX_UNUSED(blit); + } + } + void RendererContextVK::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) { BX_UNUSED(_render, _clearQuad, _textVideoMemBlitter); updateResolution(_render->m_resolution); - int64_t elapsed = -bx::getHPCounter(); + int64_t timeBegin = bx::getHPCounter(); int64_t captureElapsed = 0; // m_gpuTimer.begin(m_commandList); @@ -3644,8 +3672,8 @@ VK_DESTROY // bool wireframe = !!(_render->m_debug&BGFX_DEBUG_WIREFRAME); // setDebugWireframe(wireframe); - uint16_t currentSamplerStateIdx = invalidHandle; - uint16_t currentProgramIdx = invalidHandle; + uint16_t currentSamplerStateIdx = kInvalidHandle; + uint16_t currentProgramIdx = kInvalidHandle; uint32_t currentBindHash = 0; bool hasPredefined = false; bool commandListChanged = false; @@ -3654,10 +3682,7 @@ VK_DESTROY uint16_t view = UINT16_MAX; FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS }; - BlitKey blitKey; - blitKey.decode(_render->m_blitKeys[0]); - uint16_t numBlitItems = _render->m_numBlitItems; - uint16_t blitItem = 0; + BlitState bs(_render); uint32_t blendFactor = 0; @@ -3731,9 +3756,9 @@ VK_DESTROY // uint8_t eye = 0; // uint8_t restartState = 0; - viewState.m_rect = _render->m_rect[0]; + viewState.m_rect = _render->m_view[0].m_rect; - int32_t numItems = _render->m_num; + int32_t numItems = _render->m_numRenderItems; for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;) { const uint64_t encodedKey = _render->m_sortKeys[item]; @@ -3745,7 +3770,9 @@ VK_DESTROY || item == numItems ; - const RenderItem& renderItem = _render->m_renderItem[_render->m_sortValues[item] ]; + const uint32_t itemIdx = _render->m_sortValues[item]; + const RenderItem& renderItem = _render->m_renderItem[itemIdx]; + const RenderBind& renderBind = _render->m_renderItemBind[itemIdx]; ++item; if (viewChanged) @@ -3765,17 +3792,17 @@ finishAll(); view = key.m_view; currentPipeline = VK_NULL_HANDLE; - currentSamplerStateIdx = invalidHandle; + currentSamplerStateIdx = kInvalidHandle; BX_UNUSED(currentSamplerStateIdx); - currentProgramIdx = invalidHandle; + currentProgramIdx = kInvalidHandle; hasPredefined = false; - fbh = _render->m_fb[view]; + fbh = _render->m_view[view].m_fbh; setFrameBuffer(fbh); - viewState.m_rect = _render->m_rect[view]; - const Rect& rect = _render->m_rect[view]; - const Rect& scissorRect = _render->m_scissor[view]; + viewState.m_rect = _render->m_view[view].m_rect; + const Rect& rect = _render->m_view[view].m_rect; + const Rect& scissorRect = _render->m_view[view].m_scissor; viewHasScissor = !scissorRect.isZero(); viewScissorRect = viewHasScissor ? scissorRect : rect; @@ -3805,7 +3832,7 @@ BX_UNUSED(currentSamplerStateIdx); restoreScissor = false; - Clear& clr = _render->m_clear[view]; + Clear& clr = _render->m_view[view].m_clear; if (BGFX_CLEAR_NONE != clr.m_flags) { Rect clearRect = rect; @@ -3815,77 +3842,7 @@ BX_UNUSED(currentSamplerStateIdx); prim = s_primInfo[BX_COUNTOF(s_primName)]; // Force primitive type update. - const uint8_t blitView = SortKey::decodeView(encodedKey); - for (; blitItem < numBlitItems && blitKey.m_view <= blitView; blitItem++) - { - const BlitItem& blit = _render->m_blitItem[blitItem]; - blitKey.decode(_render->m_blitKeys[blitItem+1]); - BX_UNUSED(blit); - -// const TextureD3D12& src = m_textures[blit.m_src.idx]; -// const TextureD3D12& dst = m_textures[blit.m_dst.idx]; -// -// uint32_t srcWidth = bx::uint32_min(src.m_width, blit.m_srcX + blit.m_width) - blit.m_srcX; -// uint32_t srcHeight = bx::uint32_min(src.m_height, blit.m_srcY + blit.m_height) - blit.m_srcY; -// uint32_t srcDepth = bx::uint32_min(src.m_depth, blit.m_srcZ + blit.m_depth) - blit.m_srcZ; -// uint32_t dstWidth = bx::uint32_min(dst.m_width, blit.m_dstX + blit.m_width) - blit.m_dstX; -// uint32_t dstHeight = bx::uint32_min(dst.m_height, blit.m_dstY + blit.m_height) - blit.m_dstY; -// uint32_t dstDepth = bx::uint32_min(dst.m_depth, blit.m_dstZ + blit.m_depth) - blit.m_dstZ; -// uint32_t width = bx::uint32_min(srcWidth, dstWidth); -// uint32_t height = bx::uint32_min(srcHeight, dstHeight); -// uint32_t depth = bx::uint32_min(srcDepth, dstDepth); -// -// if (TextureD3D12::Texture3D == src.m_type) -// { -// D3D12_BOX box; -// box.left = blit.m_srcX; -// box.top = blit.m_srcY; -// box.front = blit.m_srcZ; -// box.right = blit.m_srcX + width; -// box.bottom = blit.m_srcY + height;; -// box.back = blit.m_srcZ + bx::uint32_imax(1, depth); -// -// D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ 0 }} }; -// D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ 0 }} }; -// m_commandList->CopyTextureRegion(&dstLocation -// , blit.m_dstX -// , blit.m_dstY -// , blit.m_dstZ -// , &srcLocation -// , &box -// ); -// } -// else -// { -// D3D12_BOX box; -// box.left = blit.m_srcX; -// box.top = blit.m_srcY; -// box.front = 0; -// box.right = blit.m_srcX + width; -// box.bottom = blit.m_srcY + height;; -// box.back = 1; -// -// const uint32_t srcZ = TextureD3D12::TextureCube == src.m_type -// ? blit.m_srcZ -// : 0 -// ; -// const uint32_t dstZ = TextureD3D12::TextureCube == dst.m_type -// ? blit.m_dstZ -// : 0 -// ; -// -// D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ dstZ*dst.m_numMips+blit.m_dstMip }} }; -// D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ srcZ*src.m_numMips+blit.m_srcMip }} }; -// bool depthStencil = isDepth(TextureFormat::Enum(src.m_textureFormat) ); -// m_commandList->CopyTextureRegion(&dstLocation -// , blit.m_dstX -// , blit.m_dstY -// , 0 -// , &srcLocation -// , depthStencil ? NULL : &box -// ); -// } - } + submitBlit(bs, view); } if (isCompute) @@ -3912,7 +3869,7 @@ BX_UNUSED(currentSamplerStateIdx); currentBindHash = 0; } -// uint32_t bindHash = bx::hashMurmur2A(compute.m_bind, sizeof(compute.m_bind) ); +// uint32_t bindHash = bx::hash<bx::HashMurmur2A>(renderBind.m_bind, sizeof(renderBind.m_bind) ); // if (currentBindHash != bindHash) // { // currentBindHash = bindHash; @@ -3925,8 +3882,8 @@ BX_UNUSED(currentSamplerStateIdx); // // for (uint32_t ii = 0; ii < BGFX_MAX_COMPUTE_BINDINGS; ++ii) // { -// const Binding& bind = compute.m_bind[ii]; -// if (invalidHandle != bind.m_idx) +// const Binding& bind = renderBind.m_bind[ii]; +// if (kInvalidHandle != bind.m_idx) // { // switch (bind.m_type) // { @@ -4001,10 +3958,10 @@ BX_UNUSED(currentSamplerStateIdx); // } bool constantsChanged = false; - if (compute.m_constBegin < compute.m_constEnd + if (compute.m_uniformBegin < compute.m_uniformEnd || currentProgramIdx != key.m_program) { - rendererUpdateUniforms(this, _render->m_uniformBuffer, compute.m_constBegin, compute.m_constEnd); + rendererUpdateUniforms(this, _render->m_uniformBuffer[compute.m_uniformIdx], compute.m_uniformBegin, compute.m_uniformEnd); currentProgramIdx = key.m_program; ProgramVK& program = m_program[currentProgramIdx]; @@ -4103,8 +4060,8 @@ BX_UNUSED(currentSamplerStateIdx); currentPipeline = VK_NULL_HANDLE; currentBindHash = 0; - currentSamplerStateIdx = invalidHandle; - currentProgramIdx = invalidHandle; + currentSamplerStateIdx = kInvalidHandle; + currentProgramIdx = kInvalidHandle; currentState.clear(); currentState.m_scissor = !draw.m_scissor; changedFlags = BGFX_STATE_MASK; @@ -4116,7 +4073,7 @@ BX_UNUSED(currentSamplerStateIdx); primIndex = uint8_t(pt>>BGFX_STATE_PT_SHIFT); } - rendererUpdateUniforms(this, _render->m_uniformBuffer, draw.m_constBegin, draw.m_constEnd); + rendererUpdateUniforms(this, _render->m_uniformBuffer[draw.m_uniformIdx], draw.m_uniformBegin, draw.m_uniformEnd); if (isValid(draw.m_stream[0].m_handle) ) { @@ -4138,7 +4095,7 @@ BX_UNUSED(currentSamplerStateIdx); ); uint16_t scissor = draw.m_scissor; - uint32_t bindHash = bx::hashMurmur2A(draw.m_bind, sizeof(draw.m_bind) ); + uint32_t bindHash = bx::hash<bx::HashMurmur2A>(renderBind.m_bind, sizeof(renderBind.m_bind) ); if (currentBindHash != bindHash || 0 != changedStencil || (hasFactor && blendFactor != draw.m_rgba) @@ -4164,8 +4121,8 @@ BX_UNUSED(currentSamplerStateIdx); // srvHandle[0].ptr = 0; // for (uint32_t stage = 0; stage < BGFX_CONFIG_MAX_TEXTURE_SAMPLERS; ++stage) // { -// const Binding& bind = draw.m_bind[stage]; -// if (invalidHandle != bind.m_idx) +// const Binding& bind = renderBind.m_bind[stage]; +// if (kInvalidHandle != bind.m_idx) // { // TextureD3D12& texture = m_textures[bind.m_idx]; // texture.setState(m_commandList, D3D12_RESOURCE_STATE_GENERIC_READ); @@ -4255,7 +4212,7 @@ BX_UNUSED(currentSamplerStateIdx); restoreScissor = false; VkRect2D rc; rc.offset.x = viewScissorRect.m_x; - rc.offset.x = viewScissorRect.m_y; + rc.offset.y = viewScissorRect.m_y; rc.extent.width = viewScissorRect.m_x + viewScissorRect.m_width; rc.extent.height = viewScissorRect.m_y + viewScissorRect.m_height; vkCmdSetScissor(m_commandBuffer, 0, 1, &rc); @@ -4265,7 +4222,7 @@ BX_UNUSED(currentSamplerStateIdx); { restoreScissor = true; Rect scissorRect; - scissorRect.setIntersect(viewScissorRect,_render->m_rectCache.m_cache[scissor]); + scissorRect.setIntersect(viewScissorRect, _render->m_frameCache.m_rectCache.m_cache[scissor]); if (scissorRect.isZeroArea() ) { continue; @@ -4273,7 +4230,7 @@ BX_UNUSED(currentSamplerStateIdx); VkRect2D rc; rc.offset.x = scissorRect.m_x; - rc.offset.x = scissorRect.m_y; + rc.offset.y = scissorRect.m_y; rc.extent.width = scissorRect.m_x + scissorRect.m_width; rc.extent.height = scissorRect.m_y + scissorRect.m_height; vkCmdSetScissor(m_commandBuffer, 0, 1, &rc); @@ -4287,7 +4244,7 @@ BX_UNUSED(currentSamplerStateIdx); } bool constantsChanged = false; - if (draw.m_constBegin < draw.m_constEnd + if (draw.m_uniformBegin < draw.m_uniformEnd || currentProgramIdx != key.m_program || BGFX_STATE_ALPHA_REF_MASK & changedFlags) { @@ -4393,19 +4350,13 @@ BX_UNUSED(currentSamplerStateIdx); } } + submitBlit(bs, BGFX_CONFIG_MAX_VIEWS); + // m_batch.end(m_commandList); } - int64_t now = bx::getHPCounter(); - elapsed += now; - - static int64_t last = now; - - Stats& perfStats = _render->m_perfStats; - perfStats.cpuTimeBegin = last; - - int64_t frameTime = now - last; - last = now; + int64_t timeEnd = bx::getHPCounter(); + int64_t frameTime = timeEnd - timeBegin; static int64_t min = frameTime; static int64_t max = frameTime; @@ -4435,7 +4386,9 @@ BX_UNUSED(presentMin, presentMax); const int64_t timerFreq = bx::getHPFrequency(); - perfStats.cpuTimeEnd = now; + Stats& perfStats = _render->m_perfStats; + perfStats.cpuTimeBegin = timeBegin; + perfStats.cpuTimeEnd = timeEnd; perfStats.cpuTimerFreq = timerFreq; // perfStats.gpuTimeBegin = m_gpuTimer.m_begin; // perfStats.gpuTimeEnd = m_gpuTimer.m_end; @@ -4443,6 +4396,8 @@ BX_UNUSED(presentMin, presentMax); // perfStats.numDraw = statsKeyType[0]; // perfStats.numCompute = statsKeyType[1]; // perfStats.maxGpuLatency = maxGpuLatency; + perfStats.gpuMemoryMax = -INT64_MAX; + perfStats.gpuMemoryUsed = -INT64_MAX; if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) ) { @@ -4451,12 +4406,13 @@ BX_UNUSED(presentMin, presentMax); // m_needPresent = true; TextVideoMem& tvm = m_textVideoMem; - static int64_t next = now; + static int64_t next = timeEnd; - if (now >= next) + if (timeEnd >= next) { - next = now + bx::getHPFrequency(); - double freq = double(bx::getHPFrequency() ); + next = timeEnd + timerFreq; + + double freq = double(timerFreq); double toMs = 1000.0 / freq; tvm.clear(); @@ -4537,9 +4493,9 @@ BX_UNUSED(presentMin, presentMax); , !!(m_resolution.m_flags&BGFX_RESET_MAXANISOTROPY) ? '\xfe' : ' ' ); - double elapsedCpuMs = double(elapsed)*toMs; + double elapsedCpuMs = double(frameTime)*toMs; tvm.printf(10, pos++, 0x8e, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] " - , _render->m_num + , _render->m_numRenderItems , statsKeyType[0] , statsKeyType[1] , elapsedCpuMs @@ -4573,7 +4529,7 @@ BX_UNUSED(presentMin, presentMax); } tvm.printf(10, pos++, 0x8e, " Indices: %7d ", statsNumIndices); - tvm.printf(10, pos++, 0x8e, " Uniform size: %7d, Max: %7d ", _render->m_uniformEnd, _render->m_uniformMax); +// tvm.printf(10, pos++, 0x8e, " Uniform size: %7d, Max: %7d ", _render->m_uniformEnd, _render->m_uniformMax); tvm.printf(10, pos++, 0x8e, " DVB size: %7d ", _render->m_vboffset); tvm.printf(10, pos++, 0x8e, " DIB size: %7d ", _render->m_iboffset); |