diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index f218a8dd66c..701ada4b08f 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -72,6 +72,7 @@ foreach arch : ['6', '7'] 'panvk_vX_meta_clear.c', 'panvk_vX_nir_lower_descriptors.c', 'panvk_vX_pipeline.c', + 'panvk_vX_sampler.c', 'panvk_vX_shader.c', ], include_directories : [ diff --git a/src/panfrost/vulkan/panvk_cs.h b/src/panfrost/vulkan/panvk_cs.h index 5cece0eed3e..3260a666fe8 100644 --- a/src/panfrost/vulkan/panvk_cs.h +++ b/src/panfrost/vulkan/panvk_cs.h @@ -71,18 +71,6 @@ panvk_per_arch(translate_compare_func)(VkCompareOp comp) return (enum mali_func)comp; } - -static inline enum mali_func -panvk_per_arch(translate_sampler_compare_func)( - const VkSamplerCreateInfo *pCreateInfo) -{ - if (!pCreateInfo->compareEnable) - return MALI_FUNC_NEVER; - - enum mali_func f = - panvk_per_arch(translate_compare_func)(pCreateInfo->compareOp); - return panfrost_flip_compare_func(f); -} #endif void panvk_sysval_upload_viewport_scale(const VkViewport *viewport, diff --git a/src/panfrost/vulkan/panvk_descriptor_set.c b/src/panfrost/vulkan/panvk_descriptor_set.c index c8a710dca76..39e07401840 100644 --- a/src/panfrost/vulkan/panvk_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_descriptor_set.c @@ -25,6 +25,7 @@ * DEALINGS IN THE SOFTWARE. */ #include "panvk_private.h" +#include "panvk_sampler.h" #include #include diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index 6bf5ccfdfec..ba01d995d1f 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -1425,19 +1425,6 @@ panvk_ResetEvent(VkDevice _device, VkEvent _event) return VK_SUCCESS; } -VKAPI_ATTR void VKAPI_CALL -panvk_DestroySampler(VkDevice _device, VkSampler _sampler, - const VkAllocationCallbacks *pAllocator) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - VK_FROM_HANDLE(panvk_sampler, sampler, _sampler); - - if (!sampler) - return; - - vk_sampler_destroy(&device->vk, pAllocator, &sampler->vk); -} - VKAPI_ATTR void VKAPI_CALL panvk_GetPhysicalDeviceExternalSemaphoreProperties( VkPhysicalDevice physicalDevice, diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index 61c4316a62c..7b262d20fa6 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -899,13 +899,6 @@ struct panvk_image_view { } descs; }; -#define SAMPLER_DESC_WORDS 8 - -struct panvk_sampler { - struct vk_sampler vk; - uint32_t desc[SAMPLER_DESC_WORDS]; -}; - VK_DEFINE_HANDLE_CASTS(panvk_cmd_buffer, vk.base, VkCommandBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER) VK_DEFINE_HANDLE_CASTS(panvk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE) @@ -931,8 +924,6 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline, base, VkPipeline, VK_OBJECT_TYPE_PIPELINE) VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_layout, vk.base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT) -VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_sampler, vk.base, VkSampler, - VK_OBJECT_TYPE_SAMPLER) #ifdef PAN_ARCH #include "panvk_vX_cmd_buffer.h" diff --git a/src/panfrost/vulkan/panvk_sampler.h b/src/panfrost/vulkan/panvk_sampler.h new file mode 100644 index 00000000000..992afafaf8f --- /dev/null +++ b/src/panfrost/vulkan/panvk_sampler.h @@ -0,0 +1,23 @@ +/* + * Copyright © 2021 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#ifndef PANVK_SAMPLER_H +#define PANVK_SAMPLER_H + +#include + +#include "vk_sampler.h" + +#define SAMPLER_DESC_WORDS 8 + +struct panvk_sampler { + struct vk_sampler vk; + uint32_t desc[SAMPLER_DESC_WORDS]; +}; + +VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_sampler, vk.base, VkSampler, + VK_OBJECT_TYPE_SAMPLER) + +#endif diff --git a/src/panfrost/vulkan/panvk_vX_cs.c b/src/panfrost/vulkan/panvk_vX_cs.c index b12af1214b1..96cec034d14 100644 --- a/src/panfrost/vulkan/panvk_vX_cs.c +++ b/src/panfrost/vulkan/panvk_vX_cs.c @@ -41,38 +41,6 @@ #include "vk_sampler.h" -static enum mali_mipmap_mode -panvk_translate_sampler_mipmap_mode(VkSamplerMipmapMode mode) -{ - switch (mode) { - case VK_SAMPLER_MIPMAP_MODE_NEAREST: - return MALI_MIPMAP_MODE_NEAREST; - case VK_SAMPLER_MIPMAP_MODE_LINEAR: - return MALI_MIPMAP_MODE_TRILINEAR; - default: - unreachable("Invalid mipmap mode"); - } -} - -static unsigned -panvk_translate_sampler_address_mode(VkSamplerAddressMode mode) -{ - switch (mode) { - case VK_SAMPLER_ADDRESS_MODE_REPEAT: - return MALI_WRAP_MODE_REPEAT; - case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT: - return MALI_WRAP_MODE_MIRRORED_REPEAT; - case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE: - return MALI_WRAP_MODE_CLAMP_TO_EDGE; - case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER: - return MALI_WRAP_MODE_CLAMP_TO_BORDER; - case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE: - return MALI_WRAP_MODE_MIRRORED_CLAMP_TO_EDGE; - default: - unreachable("Invalid wrap"); - } -} - static mali_pixel_format panvk_varying_hw_format(const struct panvk_device *dev, const struct panvk_varyings_info *varyings, @@ -245,37 +213,6 @@ panvk_per_arch(emit_attrib_bufs)(const struct panvk_attribs_info *info, } } -void -panvk_per_arch(emit_sampler)(const VkSamplerCreateInfo *pCreateInfo, void *desc) -{ - VkClearColorValue border_color = - vk_sampler_border_color_value(pCreateInfo, NULL); - - pan_pack(desc, SAMPLER, cfg) { - cfg.magnify_nearest = pCreateInfo->magFilter == VK_FILTER_NEAREST; - cfg.minify_nearest = pCreateInfo->minFilter == VK_FILTER_NEAREST; - cfg.mipmap_mode = - panvk_translate_sampler_mipmap_mode(pCreateInfo->mipmapMode); - cfg.normalized_coordinates = !pCreateInfo->unnormalizedCoordinates; - - cfg.lod_bias = pCreateInfo->mipLodBias; - cfg.minimum_lod = pCreateInfo->minLod; - cfg.maximum_lod = pCreateInfo->maxLod; - cfg.wrap_mode_s = - panvk_translate_sampler_address_mode(pCreateInfo->addressModeU); - cfg.wrap_mode_t = - panvk_translate_sampler_address_mode(pCreateInfo->addressModeV); - cfg.wrap_mode_r = - panvk_translate_sampler_address_mode(pCreateInfo->addressModeW); - cfg.compare_function = - panvk_per_arch(translate_sampler_compare_func)(pCreateInfo); - cfg.border_color_r = border_color.uint32[0]; - cfg.border_color_g = border_color.uint32[1]; - cfg.border_color_b = border_color.uint32[2]; - cfg.border_color_a = border_color.uint32[3]; - } -} - static void panvk_emit_attrib(const struct panvk_device *dev, const struct panvk_draw_info *draw, diff --git a/src/panfrost/vulkan/panvk_vX_cs.h b/src/panfrost/vulkan/panvk_vX_cs.h index 249a03a1302..99a36849773 100644 --- a/src/panfrost/vulkan/panvk_vX_cs.h +++ b/src/panfrost/vulkan/panvk_vX_cs.h @@ -63,9 +63,6 @@ void panvk_per_arch(emit_ubos)(const struct panvk_pipeline *pipeline, const struct panvk_descriptor_state *state, void *descs); -void panvk_per_arch(emit_sampler)(const VkSamplerCreateInfo *pCreateInfo, - void *desc); - void panvk_per_arch(emit_vertex_job)(const struct panvk_pipeline *pipeline, const struct panvk_draw_info *draw, void *job); diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index 9e71d9cfc87..64c728f18ca 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -45,6 +45,7 @@ #include "panvk_buffer.h" #include "panvk_cs.h" +#include "panvk_sampler.h" #define PANVK_DESCRIPTOR_ALIGN 8 diff --git a/src/panfrost/vulkan/panvk_vX_device.c b/src/panfrost/vulkan/panvk_vX_device.c index b6b8bf0ba7f..5be4f3ee208 100644 --- a/src/panfrost/vulkan/panvk_vX_device.c +++ b/src/panfrost/vulkan/panvk_vX_device.c @@ -300,26 +300,3 @@ panvk_per_arch(queue_submit)(struct vk_queue *vk_queue, return VK_SUCCESS; } - -VKAPI_ATTR VkResult VKAPI_CALL -panvk_per_arch(CreateSampler)(VkDevice _device, - const VkSamplerCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkSampler *pSampler) -{ - VK_FROM_HANDLE(panvk_device, device, _device); - struct panvk_sampler *sampler; - - assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO); - - sampler = - vk_sampler_create(&device->vk, pCreateInfo, pAllocator, sizeof(*sampler)); - if (!sampler) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - STATIC_ASSERT(sizeof(sampler->desc) >= pan_size(SAMPLER)); - panvk_per_arch(emit_sampler)(pCreateInfo, &sampler->desc); - *pSampler = panvk_sampler_to_handle(sampler); - - return VK_SUCCESS; -} diff --git a/src/panfrost/vulkan/panvk_vX_sampler.c b/src/panfrost/vulkan/panvk_vX_sampler.c new file mode 100644 index 00000000000..fdf0303b879 --- /dev/null +++ b/src/panfrost/vulkan/panvk_vX_sampler.c @@ -0,0 +1,113 @@ +/* + * Copyright © 2021 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#include "genxml/gen_macros.h" + +#include "panvk_private.h" +#include "panvk_sampler.h" + +#include "pan_encoder.h" + +static enum mali_mipmap_mode +panvk_translate_sampler_mipmap_mode(VkSamplerMipmapMode mode) +{ + switch (mode) { + case VK_SAMPLER_MIPMAP_MODE_NEAREST: + return MALI_MIPMAP_MODE_NEAREST; + case VK_SAMPLER_MIPMAP_MODE_LINEAR: + return MALI_MIPMAP_MODE_TRILINEAR; + default: + unreachable("Invalid mipmap mode"); + } +} + +static unsigned +panvk_translate_sampler_address_mode(VkSamplerAddressMode mode) +{ + switch (mode) { + case VK_SAMPLER_ADDRESS_MODE_REPEAT: + return MALI_WRAP_MODE_REPEAT; + case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT: + return MALI_WRAP_MODE_MIRRORED_REPEAT; + case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE: + return MALI_WRAP_MODE_CLAMP_TO_EDGE; + case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER: + return MALI_WRAP_MODE_CLAMP_TO_BORDER; + case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE: + return MALI_WRAP_MODE_MIRRORED_CLAMP_TO_EDGE; + default: + unreachable("Invalid wrap"); + } +} + +static enum mali_func +panvk_translate_sampler_compare_func(const VkSamplerCreateInfo *pCreateInfo) +{ + if (!pCreateInfo->compareEnable) + return MALI_FUNC_NEVER; + + return panfrost_flip_compare_func((enum mali_func)pCreateInfo->compareOp); +} + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_per_arch(CreateSampler)(VkDevice _device, + const VkSamplerCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkSampler *pSampler) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + struct panvk_sampler *sampler; + + assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO); + + sampler = + vk_sampler_create(&device->vk, pCreateInfo, pAllocator, sizeof(*sampler)); + if (!sampler) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + STATIC_ASSERT(sizeof(sampler->desc) >= pan_size(SAMPLER)); + + VkClearColorValue border_color = + vk_sampler_border_color_value(pCreateInfo, NULL); + + pan_pack(sampler->desc, SAMPLER, cfg) { + cfg.magnify_nearest = pCreateInfo->magFilter == VK_FILTER_NEAREST; + cfg.minify_nearest = pCreateInfo->minFilter == VK_FILTER_NEAREST; + cfg.mipmap_mode = + panvk_translate_sampler_mipmap_mode(pCreateInfo->mipmapMode); + cfg.normalized_coordinates = !pCreateInfo->unnormalizedCoordinates; + + cfg.lod_bias = pCreateInfo->mipLodBias; + cfg.minimum_lod = pCreateInfo->minLod; + cfg.maximum_lod = pCreateInfo->maxLod; + cfg.wrap_mode_s = + panvk_translate_sampler_address_mode(pCreateInfo->addressModeU); + cfg.wrap_mode_t = + panvk_translate_sampler_address_mode(pCreateInfo->addressModeV); + cfg.wrap_mode_r = + panvk_translate_sampler_address_mode(pCreateInfo->addressModeW); + cfg.compare_function = panvk_translate_sampler_compare_func(pCreateInfo); + cfg.border_color_r = border_color.uint32[0]; + cfg.border_color_g = border_color.uint32[1]; + cfg.border_color_b = border_color.uint32[2]; + cfg.border_color_a = border_color.uint32[3]; + } + + *pSampler = panvk_sampler_to_handle(sampler); + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(DestroySampler)(VkDevice _device, VkSampler _sampler, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(panvk_device, device, _device); + VK_FROM_HANDLE(panvk_sampler, sampler, _sampler); + + if (!sampler) + return; + + vk_sampler_destroy(&device->vk, pAllocator, &sampler->vk); +}