}
CreateInstance(extensions, validationLayers);
- PreparePhysicalDevice();
}
-void Device::CreateDevice()
+void Device::CreateDevice(SurfaceImpl* surface)
{
+ PreparePhysicalDevice(surface);
+
auto queueInfos = GetQueueCreateInfos();
{
auto maxQueueCountPerFamily = 0u;
}
// create surface from the factory
- auto* surface = new SurfaceImpl(*this, vulkanSurfaceFactory->Create(mInstance, mAllocator.get(), mPhysicalDevice));
+ auto* surface = new SurfaceImpl(*this, vulkanSurfaceFactory->Create(mInstance, mAllocator.get()));
if(!surface->GetVkHandle())
{
return -1;
}
+ // Find a device that can support this surface.
+ CreateDevice(surface);
+
VkBool32 supported(VK_FALSE);
for(auto i = 0u; i < mQueueFamilyProperties.size(); ++i)
{
break;
}
}
-
assert(supported && "There is no queue family supporting presentation!");
surface->GetCapabilities() = VkAssert(mPhysicalDevice.getSurfaceCapabilitiesKHR(surface->GetVkHandle()));
}
}
-void Device::PreparePhysicalDevice()
+void Device::PreparePhysicalDevice(SurfaceImpl* surface)
{
auto devices = VkAssert(mInstance.enumeratePhysicalDevices());
assert(!devices.empty() && "No Vulkan supported device found!");
}
else // otherwise look for one which is a graphics device
{
+ auto vkSurface = surface->GetVkHandle();
+
for(auto& device : devices)
{
auto properties = device.getProperties();
properties.deviceType == vk::PhysicalDeviceType::eIntegratedGpu)
{
auto queueFamilyProperties = device.getQueueFamilyProperties();
+ int queueIndex = 0;
for(const auto& queueFamily : queueFamilyProperties)
{
if(queueFamily.queueFlags & vk::QueueFlagBits::eGraphics)
{
- mPhysicalDevice = device;
- break;
+ VkBool32 presentSupported = false;
+ auto result = device.getSurfaceSupportKHR(queueIndex, vkSurface, &presentSupported);
+ if((result == vk::Result::eSuccess) && presentSupported)
+ {
+ mPhysicalDevice = device;
+ break;
+ }
}
+ ++queueIndex;
}
}
}
public: // Create methods
void Create();
- void CreateDevice();
+ void CreateDevice(SurfaceImpl* surface);
Graphics::SurfaceId CreateSurface(Dali::Graphics::SurfaceFactory& surfaceFactory,
const Dali::Graphics::GraphicsCreateInfo& createInfo);
void DestroyInstance();
- void PreparePhysicalDevice();
+ void PreparePhysicalDevice(SurfaceImpl* surface);
void GetPhysicalDeviceProperties();
{
// Pass down depth/stencil req, partial rendering & msaa level
mGraphicsDevice.Create();
- mGraphicsDevice.CreateDevice();
-
- // Create DescriptorSetAllocator
mGraphicsController.Initialize(*this, mGraphicsDevice);
InitializeGraphicsAPI(displayConnection);
int width,
int height)
{
- // create surface ( also takes surface factory ownership )
+ // create surface ( also takes surface factory ownership ),
+ // and find viable vulkan device.
auto createInfo = mCreateInfo;
createInfo.surfaceWidth = width;
createInfo.surfaceHeight = height;
class SurfaceFactory : public Dali::Graphics::SurfaceFactory
{
public:
-
SurfaceFactory() = default;
- virtual vk::SurfaceKHR Create( vk::Instance instance,
- const vk::AllocationCallbacks* allocCallbacks,
- vk::PhysicalDevice physicalDevice ) const = 0;
+ virtual vk::SurfaceKHR Create(vk::Instance instance,
+ const vk::AllocationCallbacks* allocCallbacks) const = 0;
};
} // namespace Dali::Graphics::Vulkan
namespace Vulkan
{
-VkSurfaceWayland::VkSurfaceWayland( NativeWindowInterface& nativeWindow )
+VkSurfaceWayland::VkSurfaceWayland(NativeWindowInterface& nativeWindow)
: SurfaceFactory()
{
#ifdef ECORE_WAYLAND2
- Ecore_Wl2_Window *ecoreWl2Window = AnyCast< Ecore_Wl2_Window* >(nativeWindow.GetNativeWindow());
- w_surface = ecore_wl2_window_surface_get(ecoreWl2Window);
+ Ecore_Wl2_Window* ecoreWl2Window = AnyCast<Ecore_Wl2_Window*>(nativeWindow.GetNativeWindow());
+ w_surface = ecore_wl2_window_surface_get(ecoreWl2Window);
Ecore_Wl2_Display* wl2_display = ecore_wl2_window_display_get(ecoreWl2Window);
- w_display = ecore_wl2_display_get(wl2_display);
+ w_display = ecore_wl2_display_get(wl2_display);
#else
- Ecore_Wl_Window* ecoreWlWindow = AnyCast< Ecore_Wl_Window* >(nativeWindow.GetNativeWindow());
+ Ecore_Wl_Window* ecoreWlWindow = AnyCast<Ecore_Wl_Window*>(nativeWindow.GetNativeWindow());
w_surface = ecore_wl_window_surface_get(ecoreWlWindow);
w_display = ecore_wl_display_get();
w_surface = surface;
}
-
vk::SurfaceKHR VkSurfaceWayland::Create(
- vk::Instance instance,
- const vk::AllocationCallbacks* allocCallbacks,
- vk::PhysicalDevice physicalDevice) const
+ vk::Instance instance,
+ const vk::AllocationCallbacks* allocCallbacks) const
{
vk::WaylandSurfaceCreateInfoKHR info;
return retval;
}
-} // Vulkan
+} // namespace Vulkan
-std::unique_ptr<SurfaceFactory> SurfaceFactory::New( NativeWindowInterface& nativeWindow )
+std::unique_ptr<SurfaceFactory> SurfaceFactory::New(NativeWindowInterface& nativeWindow)
{
- auto surfaceFactory = std::unique_ptr<Graphics::Vulkan::VkSurfaceWayland>( new Graphics::Vulkan::VkSurfaceWayland( nativeWindow ) );
+ auto surfaceFactory = std::unique_ptr<Graphics::Vulkan::VkSurfaceWayland>(new Graphics::Vulkan::VkSurfaceWayland(nativeWindow));
return surfaceFactory;
}
-} // Graphics
-} // Dali
+} // namespace Graphics
+} // namespace Dali
#pragma GCC diagnostic pop
// INTERNAL INCLUDES
#include <dali/internal/graphics/vulkan/vulkan-surface-factory.h>
-
// EXTERNAL INCLUDES
#include <vulkan/vulkan.hpp>
-
namespace Dali
{
class RenderSurface;
class VkSurfaceWayland final : public SurfaceFactory
{
public:
-
VkSurfaceWayland(NativeWindowInterface& renderSurface);
VkSurfaceWayland(::wl_display* display, ::wl_surface* surface);
- virtual vk::SurfaceKHR Create(vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks,
- vk::PhysicalDevice physicalDevice) const override;
-
+ virtual vk::SurfaceKHR Create(
+ vk::Instance instance,
+ const vk::AllocationCallbacks* allocCallbacks) const override;
private:
- wl_display *w_display;
- wl_surface *w_surface;
+ wl_display* w_display;
+ wl_surface* w_surface;
};
} // Namespace Vulkan
#include <dali/graphics/vulkan/x11/vk-surface-xcb.h>
+#include <X11/Xlib-xcb.h>
#include <dali/integration-api/render-surface.h>
#include <dali/internal/window-system/common/window-render-surface.h>
-#include <X11/Xlib-xcb.h>
namespace Dali
{
namespace Vulkan
{
-VkSurfaceXcb::VkSurfaceXcb( NativeWindowInterface& nativeWindow )
+VkSurfaceXcb::VkSurfaceXcb(NativeWindowInterface& nativeWindow)
: SurfaceFactory{}
{
- mConnection = XGetXCBConnection( XOpenDisplay(nullptr) );
- mWindow = static_cast<decltype( mWindow )>( nativeWindow.GetNativeWindowId() );
+ mConnection = XGetXCBConnection(XOpenDisplay(nullptr));
+ mWindow = static_cast<decltype(mWindow)>(nativeWindow.GetNativeWindowId());
}
-vk::SurfaceKHR VkSurfaceXcb::Create( vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks,
- vk::PhysicalDevice physicalDevice) const
+vk::SurfaceKHR VkSurfaceXcb::Create(vk::Instance instance,
+ const vk::AllocationCallbacks* allocCallbacks) const
{
vk::XcbSurfaceCreateInfoKHR info;
info.setConnection(mConnection).setWindow(mWindow);
return retval;
}
-} // Vulkan
+} // namespace Vulkan
-std::unique_ptr<SurfaceFactory> SurfaceFactory::New( NativeWindowInterface& nativeWindow )
+std::unique_ptr<SurfaceFactory> SurfaceFactory::New(NativeWindowInterface& nativeWindow)
{
- auto surfaceFactory = std::unique_ptr<Graphics::Vulkan::VkSurfaceXcb>( new Graphics::Vulkan::VkSurfaceXcb( nativeWindow ) );
+ auto surfaceFactory = std::unique_ptr<Graphics::Vulkan::VkSurfaceXcb>(new Graphics::Vulkan::VkSurfaceXcb(nativeWindow));
return surfaceFactory;
}
-} // Graphics
-} // Dali
+} // namespace Graphics
+} // namespace Dali
#pragma GCC diagnostic pop
#endif
// INTERNAL INCLUDES
-#include <dali/internal/graphics/vulkan/vulkan-surface-factory.h>
#include <dali/internal/graphics/vulkan/vulkan-hpp-wrapper.h>
+#include <dali/internal/graphics/vulkan/vulkan-surface-factory.h>
namespace Dali
{
* Instantiates surface factory
* @param[in] renderSurface
*/
- VkSurfaceXcb( NativeWindowInterface& nativeWindow );
+ VkSurfaceXcb(NativeWindowInterface& nativeWindow);
- virtual vk::SurfaceKHR Create( vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks,
- vk::PhysicalDevice physicalDevice) const override;
+ virtual vk::SurfaceKHR Create(vk::Instance instance,
+ const vk::AllocationCallbacks* allocCallbacks) const override;
private:
xcb_connection_t* mConnection;
namespace Vulkan
{
-VkSurfaceXlib::VkSurfaceXlib( Dali::RenderSurface& renderSurface )
+VkSurfaceXlib::VkSurfaceXlib(Dali::RenderSurface& renderSurface)
: SurfaceFactory()
{
- auto ecoreSurface = dynamic_cast< Dali::Internal::Adaptor::WindowRenderSurface* >( &renderSurface );
- assert( ecoreSurface != nullptr && "This is not ecore surface!");
- mWindow = ecoreSurface->GetNativeWindowId();
- mDisplay = XOpenDisplay( nullptr );
+ auto ecoreSurface = dynamic_cast<Dali::Internal::Adaptor::WindowRenderSurface*>(&renderSurface);
+ assert(ecoreSurface != nullptr && "This is not ecore surface!");
+ mWindow = ecoreSurface->GetNativeWindowId();
+ mDisplay = XOpenDisplay(nullptr);
}
-vk::SurfaceKHR VkSurfaceXlib::Create( vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks,
- vk::PhysicalDevice physicalDevice ) const
+vk::SurfaceKHR VkSurfaceXlib::Create(vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks) const
{
vk::XlibSurfaceCreateInfoKHR info;
- info.setDpy( mDisplay ).setWindow( mWindow );
- auto retval = instance.createXlibSurfaceKHR( info, allocCallbacks ).value;
+ info.setDpy(mDisplay).setWindow(mWindow);
+ auto retval = instance.createXlibSurfaceKHR(info, allocCallbacks).value;
return retval;
}
-} // Vulkan
+} // namespace Vulkan
std::unique_ptr<SurfaceFactory> SurfaceFactory::New(Dali::RenderSurface& renderSurface)
{
- auto surfaceFactory = std::unique_ptr<Graphics::Vulkan::VkSurfaceXlib>( new Graphics::Vulkan::VkSurfaceXlib( renderSurface ) );
+ auto surfaceFactory = std::unique_ptr<Graphics::Vulkan::VkSurfaceXlib>(new Graphics::Vulkan::VkSurfaceXlib(renderSurface));
return surfaceFactory;
}
-} // Graphics
-} // Dali
+} // namespace Graphics
+} // namespace Dali
#pragma GCC diagnostic pop
#endif
// INTERNAL INCLUDES
-#include <dali/internal/graphics/vulkan/vulkan-surface-factory.h>
#include <dali/internal/graphics/vulkan/vulkan-hpp-wrapper.h>
+#include <dali/internal/graphics/vulkan/vulkan-surface-factory.h>
namespace Dali
{
class VkSurfaceXlib final : public SurfaceFactory
{
public:
- VkSurfaceXlib( Dali::RenderSurface& renderSurface );
+ VkSurfaceXlib(Dali::RenderSurface& renderSurface);
- virtual vk::SurfaceKHR Create( vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks,
- vk::PhysicalDevice physicalDevice ) const override;
+ virtual vk::SurfaceKHR Create(vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks) const override;
private:
Display* mDisplay;
mWindow = static_cast<decltype(mWindow)>(window);
}
-vk::SurfaceKHR VkSurfaceXlib2Xcb::Create(vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks, vk::PhysicalDevice physicalDevice) const
+vk::SurfaceKHR VkSurfaceXlib2Xcb::Create(vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks) const
{
vk::XcbSurfaceCreateInfoKHR info;
info.setConnection(mConnection).setWindow(mWindow);
VkSurfaceXlib2Xcb(::Display* display, ::Window window);
- virtual vk::SurfaceKHR Create(vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks, vk::PhysicalDevice physicalDevice) const override;
+ virtual vk::SurfaceKHR Create(vk::Instance instance, const vk::AllocationCallbacks* allocCallbacks) const override;
private:
xcb_connection_t* mConnection;