This will be useful for RADV since it hashes the state.
v3dv changes:
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20731>
static void
sha1_update_ycbcr_conversion(struct mesa_sha1 *ctx,
- const struct vk_ycbcr_conversion *conversion)
+ const struct vk_ycbcr_conversion_state *conversion)
{
SHA1_UPDATE_VALUE(ctx, conversion->format);
SHA1_UPDATE_VALUE(ctx, conversion->ycbcr_model);
for (unsigned i = 0; i < layout->array_size; i++) {
const struct v3dv_sampler *sampler = &immutable_samplers[i];
if (sampler->conversion)
- sha1_update_ycbcr_conversion(ctx, sampler->conversion);
+ sha1_update_ycbcr_conversion(ctx, &sampler->conversion->state);
}
}
}
if (ycbcr_conv_info) {
VK_FROM_HANDLE(vk_ycbcr_conversion, conversion, ycbcr_conv_info->conversion);
- ycbcr_info = vk_format_get_ycbcr_info(conversion->format);
+ ycbcr_info = vk_format_get_ycbcr_info(conversion->state.format);
if (ycbcr_info) {
sampler->plane_count = ycbcr_info->n_planes;
sampler->conversion = conversion;
return &v3dv_nir_options;
}
-static const struct vk_ycbcr_conversion *
+static const struct vk_ycbcr_conversion_state *
lookup_ycbcr_conversion(const void *_pipeline_layout, uint32_t set,
uint32_t binding, uint32_t array_index)
{
const struct v3dv_sampler *immutable_samplers =
v3dv_immutable_samplers(set_layout, bind_layout);
const struct v3dv_sampler *sampler = &immutable_samplers[array_index];
- return sampler->conversion;
+ return sampler->conversion ? &sampler->conversion->state : NULL;
} else {
return NULL;
}
nir_ssa_def *image_size;
nir_tex_instr *origin_tex;
nir_deref_instr *tex_deref;
- const struct vk_ycbcr_conversion *conversion;
+ const struct vk_ycbcr_conversion_state *conversion;
const struct vk_format_ycbcr_info *format_ycbcr_info;
};
const struct vk_format_ycbcr_plane *format_plane)
{
nir_builder *b = state->builder;
- const struct vk_ycbcr_conversion *conversion = state->conversion;
+ const struct vk_ycbcr_conversion_state *conversion = state->conversion;
nir_ssa_def *image_size = get_texture_size(state, state->tex_deref);
nir_ssa_def *comp[4] = { NULL, };
int c;
uint32_t plane)
{
nir_builder *b = state->builder;
- const struct vk_ycbcr_conversion *conversion = state->conversion;
+ const struct vk_ycbcr_conversion_state *conversion = state->conversion;
const struct vk_format_ycbcr_plane *format_plane =
&state->format_ycbcr_info->planes[plane];
nir_tex_instr *old_tex = state->origin_tex;
array_index = nir_src_as_uint(deref->arr.index);
}
- const struct vk_ycbcr_conversion *conversion =
+ const struct vk_ycbcr_conversion_state *conversion =
state->cb(state->cb_data, set, binding, array_index);
if (conversion == NULL)
return false;
struct vk_ycbcr_conversion;
-typedef const struct vk_ycbcr_conversion *
+typedef const struct vk_ycbcr_conversion_state *
(*nir_vk_ycbcr_conversion_lookup_cb)(const void *data, uint32_t set,
uint32_t binding, uint32_t array_index);
if (conv_info) {
VK_FROM_HANDLE(vk_ycbcr_conversion, conversion, conv_info->conversion);
- conv_format = conversion->format;
+ conv_format = conversion->state.format;
}
#ifdef ANDROID
return NULL;
}
-static const struct vk_ycbcr_conversion *
+static const struct vk_ycbcr_conversion_state *
lookup_ycbcr_conversion(const void *_pipeline_layout, uint32_t set,
uint32_t binding, uint32_t array_index)
{
const struct anv_sampler *sampler =
bind_layout->immutable_samplers[array_index];
- return sampler ? sampler->conversion : NULL;
+ return sampler && sampler->conversion ? &sampler->conversion->state : NULL;
}
static void
if (conversion == NULL)
break;
- ycbcr_info = vk_format_get_ycbcr_info(conversion->format);
+ ycbcr_info = vk_format_get_ycbcr_info(conversion->state.format);
if (ycbcr_info == NULL)
break;
const bool plane_has_chroma =
ycbcr_info && ycbcr_info->planes[p].has_chroma;
const VkFilter min_filter =
- plane_has_chroma ? sampler->conversion->chroma_filter : pCreateInfo->minFilter;
+ plane_has_chroma ? sampler->conversion->state.chroma_filter : pCreateInfo->minFilter;
const VkFilter mag_filter =
- plane_has_chroma ? sampler->conversion->chroma_filter : pCreateInfo->magFilter;
+ plane_has_chroma ? sampler->conversion->state.chroma_filter : pCreateInfo->magFilter;
const bool enable_min_filter_addr_rounding = min_filter != VK_FILTER_NEAREST;
const bool enable_mag_filter_addr_rounding = mag_filter != VK_FILTER_NEAREST;
/* From Broadwell PRM, SAMPLER_STATE:
* "Mip Mode Filter must be set to MIPFILTER_NONE for Planar YUV surfaces."
*/
enum isl_format plane0_isl_format = sampler->conversion ?
- anv_get_format(sampler->conversion->format)->planes[0].isl_format :
+ anv_get_format(sampler->conversion->state.format)->planes[0].isl_format :
ISL_FORMAT_UNSUPPORTED;
const bool isl_format_is_planar_yuv =
plane0_isl_format != ISL_FORMAT_UNSUPPORTED &&
if (!conversion)
return VK_ERROR_OUT_OF_HOST_MEMORY;
- conversion->format = pCreateInfo->format;
- conversion->ycbcr_model = pCreateInfo->ycbcrModel;
- conversion->ycbcr_range = pCreateInfo->ycbcrRange;
+ struct vk_ycbcr_conversion_state *state = &conversion->state;
+
+ state->format = pCreateInfo->format;
+ state->ycbcr_model = pCreateInfo->ycbcrModel;
+ state->ycbcr_range = pCreateInfo->ycbcrRange;
/* Search for VkExternalFormatANDROID and resolve the format. */
const VkExternalFormatANDROID *android_ext_info =
/* We assume that Android externalFormat is just a VkFormat */
if (android_ext_info && android_ext_info->externalFormat) {
assert(pCreateInfo->format == VK_FORMAT_UNDEFINED);
- conversion->format = android_ext_info->externalFormat;
+ state->format = android_ext_info->externalFormat;
} else {
/* The Vulkan 1.1.95 spec says:
*
* "When creating an external format conversion, the value of
* components if ignored."
*/
- conversion->mapping[0] = pCreateInfo->components.r;
- conversion->mapping[1] = pCreateInfo->components.g;
- conversion->mapping[2] = pCreateInfo->components.b;
- conversion->mapping[3] = pCreateInfo->components.a;
+ state->mapping[0] = pCreateInfo->components.r;
+ state->mapping[1] = pCreateInfo->components.g;
+ state->mapping[2] = pCreateInfo->components.b;
+ state->mapping[3] = pCreateInfo->components.a;
}
- conversion->chroma_offsets[0] = pCreateInfo->xChromaOffset;
- conversion->chroma_offsets[1] = pCreateInfo->yChromaOffset;
- conversion->chroma_filter = pCreateInfo->chromaFilter;
+ state->chroma_offsets[0] = pCreateInfo->xChromaOffset;
+ state->chroma_offsets[1] = pCreateInfo->yChromaOffset;
+ state->chroma_filter = pCreateInfo->chromaFilter;
const struct vk_format_ycbcr_info *ycbcr_info =
- vk_format_get_ycbcr_info(conversion->format);
+ vk_format_get_ycbcr_info(state->format);
bool has_chroma_subsampled = false;
if (ycbcr_info) {
has_chroma_subsampled = true;
}
}
- conversion->chroma_reconstruction = has_chroma_subsampled &&
- (conversion->chroma_offsets[0] == VK_CHROMA_LOCATION_COSITED_EVEN ||
- conversion->chroma_offsets[1] == VK_CHROMA_LOCATION_COSITED_EVEN);
+ state->chroma_reconstruction = has_chroma_subsampled &&
+ (state->chroma_offsets[0] == VK_CHROMA_LOCATION_COSITED_EVEN ||
+ state->chroma_offsets[1] == VK_CHROMA_LOCATION_COSITED_EVEN);
*pYcbcrConversion = vk_ycbcr_conversion_to_handle(conversion);
extern "C" {
#endif
-struct vk_ycbcr_conversion {
- struct vk_object_base base;
-
+struct vk_ycbcr_conversion_state {
VkFormat format;
VkSamplerYcbcrModelConversion ycbcr_model;
VkSamplerYcbcrRange ycbcr_range;
bool chroma_reconstruction;
};
+struct vk_ycbcr_conversion {
+ struct vk_object_base base;
+ struct vk_ycbcr_conversion_state state;
+};
+
VK_DEFINE_NONDISP_HANDLE_CASTS(vk_ycbcr_conversion, base,
VkSamplerYcbcrConversion,
VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION)