panvk: Move the VkSampler logic to its own file

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Rebecca Mckeever <rebecca.mckeever@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28170>
This commit is contained in:
Boris Brezillon 2023-12-15 14:14:16 +01:00 committed by Marge Bot
parent 5a817bd62b
commit 6b511f7564
11 changed files with 139 additions and 123 deletions

View file

@ -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 : [

View file

@ -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,

View file

@ -25,6 +25,7 @@
* DEALINGS IN THE SOFTWARE.
*/
#include "panvk_private.h"
#include "panvk_sampler.h"
#include <assert.h>
#include <fcntl.h>

View file

@ -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,

View file

@ -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"

View file

@ -0,0 +1,23 @@
/*
* Copyright © 2021 Collabora Ltd.
* SPDX-License-Identifier: MIT
*/
#ifndef PANVK_SAMPLER_H
#define PANVK_SAMPLER_H
#include <stdint.h>
#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

View file

@ -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,

View file

@ -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);

View file

@ -45,6 +45,7 @@
#include "panvk_buffer.h"
#include "panvk_cs.h"
#include "panvk_sampler.h"
#define PANVK_DESCRIPTOR_ALIGN 8

View file

@ -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;
}

View file

@ -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);
}