mirror of
https://github.com/italicsjenga/portability.git
synced 2024-11-26 00:41:33 +11:00
Implement vkGetPhysicalDeviceFormatProperties and parts of 06 - depth stencil sample
This commit is contained in:
parent
e90c0fdf59
commit
740cec2c9b
|
@ -14,7 +14,7 @@ make
|
||||||
Build the Rust library (portability implementation):
|
Build the Rust library (portability implementation):
|
||||||
|
|
||||||
```
|
```
|
||||||
cargo build
|
cargo build -p portability
|
||||||
```
|
```
|
||||||
|
|
||||||
Build the native example:
|
Build the native example:
|
||||||
|
|
|
@ -39,13 +39,75 @@ pub fn format_from_hal(format: format::Format) -> VkFormat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hal_from_format(format: VkFormat) -> format::Format {
|
pub fn format_properties_from_hal(properties: format::Properties) -> VkFormatProperties {
|
||||||
|
VkFormatProperties {
|
||||||
|
linearTilingFeatures: image_features_from_hal(properties.linear_tiling),
|
||||||
|
optimalTilingFeatures: image_features_from_hal(properties.optimal_tiling),
|
||||||
|
bufferFeatures: buffer_features_from_hal(properties.buffer_features),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn image_features_from_hal(features: format::ImageFeature) -> VkFormatFeatureFlags {
|
||||||
|
let mut flags = 0;
|
||||||
|
|
||||||
|
if features.contains(format::ImageFeature::SAMPLED) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::STORAGE) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::STORAGE_ATOMIC) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::COLOR_ATTACHMENT) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::COLOR_ATTACHMENT_BLEND) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::DEPTH_STENCIL_ATTACHMENT) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::BLIT_SRC) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_BLIT_SRC_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::BLIT_DST) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_BLIT_DST_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::ImageFeature::SAMPLED_LINEAR) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT as _;
|
||||||
|
}
|
||||||
|
|
||||||
|
flags
|
||||||
|
}
|
||||||
|
|
||||||
|
fn buffer_features_from_hal(features: format::BufferFeature) -> VkFormatFeatureFlags {
|
||||||
|
let mut flags = 0;
|
||||||
|
|
||||||
|
if features.contains(format::BufferFeature::UNIFORM_TEXEL) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::BufferFeature::STORAGE_TEXEL) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::BufferFeature::STORAGE_TEXEL_ATOMIC) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT as _;
|
||||||
|
}
|
||||||
|
if features.contains(format::BufferFeature::VERTEX) {
|
||||||
|
flags |= VkFormatFeatureFlagBits::VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT as _;
|
||||||
|
}
|
||||||
|
|
||||||
|
flags
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn map_format(format: VkFormat) -> format::Format {
|
||||||
use VkFormat::*;
|
use VkFormat::*;
|
||||||
use hal::format::ChannelType::*;
|
use hal::format::ChannelType::*;
|
||||||
use hal::format::SurfaceType::*;
|
use hal::format::SurfaceType::*;
|
||||||
|
|
||||||
let (sf, cf) = match format {
|
let (sf, cf) = match format {
|
||||||
VK_FORMAT_B8G8R8A8_UNORM => (B8_G8_R8_A8, Unorm),
|
VK_FORMAT_B8G8R8A8_UNORM => (B8_G8_R8_A8, Unorm),
|
||||||
|
VK_FORMAT_D16_UNORM => (D16, Unorm),
|
||||||
_ => {
|
_ => {
|
||||||
panic!("format {:?}", format);
|
panic!("format {:?}", format);
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,12 +73,14 @@ extern "C" {
|
||||||
pFeatures:
|
pFeatures:
|
||||||
*mut VkPhysicalDeviceFeatures);
|
*mut VkPhysicalDeviceFeatures);
|
||||||
}
|
}
|
||||||
extern "C" {
|
#[inline]
|
||||||
pub fn vkGetPhysicalDeviceFormatProperties(physicalDevice:
|
pub extern fn gfxGetPhysicalDeviceFormatProperties(
|
||||||
VkPhysicalDevice,
|
adapter: VkPhysicalDevice,
|
||||||
format: VkFormat,
|
format: VkFormat,
|
||||||
pFormatProperties:
|
pFormatProperties: *mut VkFormatProperties,
|
||||||
*mut VkFormatProperties);
|
) {
|
||||||
|
let properties = adapter.physical_device.format_properties(conv::map_format(format));
|
||||||
|
unsafe { *pFormatProperties = conv::format_properties_from_hal(properties); }
|
||||||
}
|
}
|
||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn vkGetPhysicalDeviceImageFormatProperties(physicalDevice:
|
pub fn vkGetPhysicalDeviceImageFormatProperties(physicalDevice:
|
||||||
|
@ -439,7 +441,7 @@ pub extern fn gfxCreateImageView(
|
||||||
.device
|
.device
|
||||||
.create_image_view(
|
.create_image_view(
|
||||||
&info.image,
|
&info.image,
|
||||||
conv::hal_from_format(info.format),
|
conv::map_format(info.format),
|
||||||
conv::map_swizzle(info.components),
|
conv::map_swizzle(info.components),
|
||||||
conv::map_subresource_range(info.subresourceRange),
|
conv::map_subresource_range(info.subresourceRange),
|
||||||
);
|
);
|
||||||
|
@ -1087,7 +1089,7 @@ pub extern fn gfxCreateSwapchainKHR(
|
||||||
assert_eq!(info.imageSharingMode, VkSharingMode::VK_SHARING_MODE_EXCLUSIVE); // TODO
|
assert_eq!(info.imageSharingMode, VkSharingMode::VK_SHARING_MODE_EXCLUSIVE); // TODO
|
||||||
|
|
||||||
let config = hal::SwapchainConfig {
|
let config = hal::SwapchainConfig {
|
||||||
color_format: conv::hal_from_format(info.imageFormat),
|
color_format: conv::map_format(info.imageFormat),
|
||||||
depth_stencil_format: None,
|
depth_stencil_format: None,
|
||||||
image_count: info.minImageCount,
|
image_count: info.minImageCount,
|
||||||
};
|
};
|
||||||
|
|
|
@ -74,6 +74,14 @@ pub extern fn vkDestroyImageView(
|
||||||
) {
|
) {
|
||||||
gfxDestroyImageView(device, imageView, pAllocator)
|
gfxDestroyImageView(device, imageView, pAllocator)
|
||||||
}
|
}
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern fn vkGetPhysicalDeviceFormatProperties(
|
||||||
|
adapter: VkPhysicalDevice,
|
||||||
|
format: VkFormat,
|
||||||
|
pFormatProperties: *mut VkFormatProperties,
|
||||||
|
) {
|
||||||
|
gfxGetPhysicalDeviceFormatProperties(adapter, format, pFormatProperties)
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn vkCreateCommandPool(
|
pub extern fn vkCreateCommandPool(
|
||||||
|
|
|
@ -1,5 +1,25 @@
|
||||||
/// Sample code adopted from https://github.com/LunarG/VulkanSamples
|
/// Sample code adopted from https://github.com/LunarG/VulkanSamples
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Vulkan Samples
|
||||||
|
*
|
||||||
|
* Copyright (C) 2015-2016 Valve Corporation
|
||||||
|
* Copyright (C) 2015-2016 LunarG, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#define VK_USE_PLATFORM_WIN32_KHR
|
#define VK_USE_PLATFORM_WIN32_KHR
|
||||||
#endif
|
#endif
|
||||||
|
@ -175,6 +195,28 @@ int main() {
|
||||||
assert(!res);
|
assert(!res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkImageCreateInfo image_info = {};
|
||||||
|
const VkFormat depth_format = VK_FORMAT_D16_UNORM;
|
||||||
|
VkFormatProperties props;
|
||||||
|
vkGetPhysicalDeviceFormatProperties(physical_devices[0], depth_format, &props);
|
||||||
|
printf("\tvkGetPhysicalDeviceFormatProperties\n");
|
||||||
|
printf(
|
||||||
|
"\t\tlinear_tiling_features: %x\n"
|
||||||
|
"\t\toptimal_tiling_features: %x\n"
|
||||||
|
"\t\tbuffer_features: %x\n",
|
||||||
|
props.linearTilingFeatures,
|
||||||
|
props.optimalTilingFeatures,
|
||||||
|
props.bufferFeatures);
|
||||||
|
|
||||||
|
if (props.linearTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
||||||
|
image_info.tiling = VK_IMAGE_TILING_LINEAR;
|
||||||
|
} else if (props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
||||||
|
image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||||
|
} else {
|
||||||
|
printf("VK_FORMAT_D16_UNORM unsupported.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
VkCommandPool cmd_pool = 0;
|
VkCommandPool cmd_pool = 0;
|
||||||
VkCommandPoolCreateInfo cmd_pool_info = {};
|
VkCommandPoolCreateInfo cmd_pool_info = {};
|
||||||
cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
|
|
Loading…
Reference in a new issue