mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2026-10-28 18:15:24 +08:00
Range coded slices were decoded and encoded by a subgroup of exactly 32 invocations, one for each of the states of a context, and devices which could not provide one were refused. The number of invocations now follows the subgroup size: 32 if the subgroup size can be set to it, and the largest subgroup size below it otherwise. Each invocation holds 32 divided by that number of the states of a context and of the bytes of the decoder's window, and lines are coded in chunks of as many samples. The encoder keeps its queue of 64 output bytes, and computes the slice CRC over as many segments. Devices whose subgroups are all wider than 32 invocations run the 32 invocations as part of one, and are no longer refused either. The ballot quantizers need 32 invocations, and are only used with them. With 32 invocations, the instructions executed per sample and the speed of both the decoder and the encoder are unchanged. Decoding and encoding were checked with 1 to 16 invocations on an RX 6900 XT, running the workgroups as partial subgroups, and decoding with the subgroups of 8 invocations of lavapipe.
82 lines
2.7 KiB
C
82 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2024 Lynne <dev@lynne.ee>
|
|
*
|
|
* This file is part of FFmpeg.
|
|
*
|
|
* FFmpeg is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* FFmpeg is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with FFmpeg; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef AVCODEC_FFV1_VULKAN_H
|
|
#define AVCODEC_FFV1_VULKAN_H
|
|
|
|
#include "libavutil/vulkan.h"
|
|
#include "ffv1.h"
|
|
|
|
void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, FFV1Context *f,
|
|
VkSpecializationInfo *sl,
|
|
enum AVPixelFormat sw_format);
|
|
|
|
int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f);
|
|
|
|
/* Context inputs 0 and 3 of the quant tables as a function of the signed
|
|
* 8-bit difference d, with one threshold per subgroup invocation:
|
|
* q(d) = q(-128) + scale*#{k : thresh[k] <= d}, where scale is 1 for input 0.
|
|
* scale_off holds the scale of input 3 and the sum of both q(-128). */
|
|
typedef struct FFv1QuantBallot {
|
|
int32_t thresh[MAX_QUANT_TABLES][32][2];
|
|
int32_t scale_off[MAX_QUANT_TABLES][2];
|
|
} FFv1QuantBallot;
|
|
|
|
/**
|
|
* Number of invocations that range code a slice together, as a single
|
|
* subgroup. Each of them holds CONTEXT_SIZE/lanes of the states of a
|
|
* context. This is CONTEXT_SIZE if the subgroup size can be set to it, or
|
|
* the largest subgroup size below it otherwise. required is set to the
|
|
* subgroup size the shader must be created with, or 0.
|
|
*/
|
|
uint32_t ff_ffv1_vk_rc_lanes(const FFVulkanContext *s, uint32_t *required);
|
|
|
|
/**
|
|
* Fill in the ballot quantizers of all quant tables.
|
|
* Returns 1 if all of them can be evaluated with a ballot.
|
|
*/
|
|
int ff_ffv1_vk_quant_ballot(const FFV1Context *f, FFv1QuantBallot *qb);
|
|
|
|
typedef struct FFv1ShaderParams {
|
|
VkDeviceAddress slice_data;
|
|
|
|
uint32_t extend_lookup[8];
|
|
uint16_t context_count[8];
|
|
|
|
int fmt_lut[4];
|
|
uint16_t img_size[2];
|
|
|
|
uint32_t plane_state_size;
|
|
uint32_t key_frame;
|
|
uint32_t crcref;
|
|
int micro_version;
|
|
|
|
/* Encoder-only */
|
|
int sar[2];
|
|
int pic_mode;
|
|
uint32_t slice_size_max;
|
|
uint32_t max_pixels_per_slice;
|
|
|
|
/* Decoder-only */
|
|
uint32_t remap_allowed;
|
|
} FFv1ShaderParams;
|
|
|
|
#endif /* AVCODEC_FFV1_VULKAN_H */
|