Home | History | Annotate | Download | only in vulkan
      1 #ifndef _VKPLATFORM_HPP
      2 #define _VKPLATFORM_HPP
      3 /*-------------------------------------------------------------------------
      4  * Vulkan CTS Framework
      5  * --------------------
      6  *
      7  * Copyright (c) 2015 Google Inc.
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Vulkan platform abstraction.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "vkDefs.hpp"
     27 
     28 #include <ostream>
     29 
     30 namespace tcu
     31 {
     32 class FunctionLibrary;
     33 }
     34 
     35 namespace vk
     36 {
     37 
     38 class Library
     39 {
     40 public:
     41 										Library					(void) {}
     42 	virtual								~Library				(void) {}
     43 
     44 	virtual const PlatformInterface&	getPlatformInterface	(void) const = 0;
     45 	virtual const tcu::FunctionLibrary&	getFunctionLibrary		(void) const = 0;
     46 };
     47 
     48 class PlatformDriver : public PlatformInterface
     49 {
     50 public:
     51 				PlatformDriver	(const tcu::FunctionLibrary& library);
     52 				~PlatformDriver	(void);
     53 
     54 #include "vkConcretePlatformInterface.inl"
     55 
     56 protected:
     57 	struct Functions
     58 	{
     59 #include "vkPlatformFunctionPointers.inl"
     60 	};
     61 
     62 	Functions	m_vk;
     63 };
     64 
     65 class InstanceDriver : public InstanceInterface
     66 {
     67 public:
     68 				InstanceDriver	(const PlatformInterface& platformInterface, VkInstance instance);
     69 				~InstanceDriver	(void);
     70 
     71 #include "vkConcreteInstanceInterface.inl"
     72 
     73 protected:
     74 	void		loadFunctions	(const PlatformInterface& platformInterface, VkInstance instance);
     75 
     76 	struct Functions
     77 	{
     78 #include "vkInstanceFunctionPointers.inl"
     79 	};
     80 
     81 	Functions	m_vk;
     82 };
     83 
     84 class DeviceDriver : public DeviceInterface
     85 {
     86 public:
     87 				DeviceDriver	(const PlatformInterface& platformInterface, VkInstance instance, VkDevice device);
     88 				~DeviceDriver	(void);
     89 
     90 #include "vkConcreteDeviceInterface.inl"
     91 
     92 protected:
     93 	struct Functions
     94 	{
     95 #include "vkDeviceFunctionPointers.inl"
     96 	};
     97 
     98 	Functions	m_vk;
     99 };
    100 
    101 // Defined in vkWsiPlatform.hpp
    102 namespace wsi
    103 {
    104 class Display;
    105 } // wsi
    106 
    107 struct PlatformMemoryLimits
    108 {
    109 	// System memory properties
    110 	size_t			totalSystemMemory;					//!< #bytes of system memory (heap + HOST_LOCAL) tests must not exceed
    111 
    112 	// Device memory properties
    113 	VkDeviceSize	totalDeviceLocalMemory;				//!< #bytes of total DEVICE_LOCAL memory tests must not exceed or 0 if DEVICE_LOCAL counts against system memory
    114 	VkDeviceSize	deviceMemoryAllocationGranularity;	//!< VkDeviceMemory allocation granularity (typically page size)
    115 
    116 	// Device memory page table geometry
    117 	// \todo [2016-03-23 pyry] This becomes obsolete if Vulkan API adds a way for driver to expose internal device memory allocations
    118 	VkDeviceSize	devicePageSize;						//!< Page size on device (must be rounded up to nearest POT)
    119 	VkDeviceSize	devicePageTableEntrySize;			//!< Number of bytes per page table size
    120 	size_t			devicePageTableHierarchyLevels;		//!< Number of levels in device page table hierarchy
    121 
    122 	PlatformMemoryLimits (void)
    123 		: totalSystemMemory					(0)
    124 		, totalDeviceLocalMemory			(0)
    125 		, deviceMemoryAllocationGranularity	(0)
    126 		, devicePageSize					(0)
    127 		, devicePageTableEntrySize			(0)
    128 		, devicePageTableHierarchyLevels	(0)
    129 	{}
    130 };
    131 
    132 /*--------------------------------------------------------------------*//*!
    133  * \brief Vulkan platform interface
    134  *//*--------------------------------------------------------------------*/
    135 class Platform
    136 {
    137 public:
    138 							Platform			(void) {}
    139 							~Platform			(void) {}
    140 
    141 	virtual Library*		createLibrary		(void) const = 0;
    142 
    143 	virtual wsi::Display*	createWsiDisplay	(wsi::Type wsiType) const;
    144 	virtual bool			hasDisplay	(wsi::Type wsiType) const;
    145 
    146 	virtual void			getMemoryLimits		(PlatformMemoryLimits& limits) const = 0;
    147 	virtual void			describePlatform	(std::ostream& dst) const;
    148 };
    149 
    150 inline PlatformMemoryLimits getMemoryLimits (const Platform& platform)
    151 {
    152 	PlatformMemoryLimits limits;
    153 	platform.getMemoryLimits(limits);
    154 	return limits;
    155 }
    156 
    157 } // vk
    158 
    159 #endif // _VKPLATFORM_HPP
    160