Surface handles are now indirect.

This commit is contained in:
2021-08-12 00:45:57 -07:00
parent 4d79896b76
commit 12e476dc81
7 changed files with 36 additions and 18 deletions

View File

@@ -60,6 +60,7 @@ KRContext::KRContext(const KrInitializeInfo* initializeInfo)
, m_vulkanInstance(VK_NULL_HANDLE)
, m_resourceMapSize(initializeInfo->resourceMapSize)
, m_topDeviceHandle(0)
, m_topSurfaceHandle(0)
{
m_resourceMap = (KRResource **)malloc(sizeof(KRResource*) * m_resourceMapSize);
memset(m_resourceMap, 0, m_resourceMapSize * sizeof(KRResource*));
@@ -808,6 +809,7 @@ KRContext::destroySurfaces()
}
m_surfaces.clear();
m_surfaceHandleMap.clear();
}
void
@@ -1068,9 +1070,12 @@ KrResult KRContext::createWindowSurface(const KrCreateWindowSurfaceInfo* createW
}
}
m_surfaces.insert(std::pair<KrSurfaceHandle, SurfaceInfo>(createWindowSurfaceInfo->surfaceHandle, info));
KrSurfaceHandle surfaceHandle = ++m_topSurfaceHandle;
m_surfaces.insert(std::pair<KrSurfaceHandle, SurfaceInfo>(surfaceHandle, info));
m_pPipelineManager->createPipelines(deviceInfo->logicalDevice); // TODO - Support multiple surfaces. Device needs to be passed in.
m_surfaceHandleMap.insert(std::pair<KrSurfaceMapIndex, KrSurfaceHandle>(createWindowSurfaceInfo->surfaceHandle, surfaceHandle));
m_pPipelineManager->createPipelines(surfaceHandle);
return KR_SUCCESS;
#else
@@ -1087,7 +1092,15 @@ KrResult KRContext::deleteWindowSurface(const KrDeleteWindowSurfaceInfo* deleteW
if (m_vulkanInstance == VK_NULL_HANDLE) {
return KR_ERROR_VULKAN_REQUIRED;
}
auto itr = m_surfaces.find(deleteWindowSurfaceInfo->surfaceHandle);
auto handleItr = m_surfaceHandleMap.find(deleteWindowSurfaceInfo->surfaceHandle);
if (handleItr == m_surfaceHandleMap.end()) {
return KR_ERROR_NOT_FOUND;
}
KrSurfaceHandle surfaceHandle = (*handleItr).second;
m_surfaceHandleMap.erase(handleItr);
auto itr = m_surfaces.find(surfaceHandle);
if (itr == m_surfaces.end()) {
return KR_ERROR_NOT_FOUND;
}