Restore 10 bit switch

This commit is contained in:
mittorn 2024-10-12 02:44:21 +03:00
parent a489604278
commit b9cb95c5e6
4 changed files with 25 additions and 24 deletions

View file

@ -6,8 +6,8 @@
#define WORKGROUP_SIZE 32
layout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1 ) in;
layout (binding = 0, r16) uniform image2D resultImage;
layout (binding = 1, rg16) uniform image2D resultImage2;
layout (binding = 0, r8) uniform image2D resultImage;
layout (binding = 1, rg8) uniform image2D resultImage2;
layout (binding = 2) uniform UBO
{
float frameNum;

View file

@ -65,7 +65,7 @@ struct VaapiEncoder
dpy = nullptr;
}
}
bool SetupVA(VAProfile profile, int drm_fd, int width, int height, const char *filename, int *dmabuf_fd, uint64_t *mod, uint32_t *size, uint32_t *offset, uint32_t *pitch1, uint32_t *pitch2, uint64_t *modifiers, int modifierscount)
bool SetupVA(VAProfile profile, uint32_t format, uint32_t fourcc, int drm_fd, int width, int height, const char *filename, int *dmabuf_fd, uint64_t *mod, uint32_t *size, uint32_t *offset, uint32_t *pitch1, uint32_t *pitch2, uint64_t *modifiers, int modifierscount)
{
VASurfaceAttrib va_attribs[5];
VASurfaceAttribExternalBuffers va_attrib_extbuf = {0};
@ -85,7 +85,7 @@ struct VaapiEncoder
{
return false;
}
va_attrib_extbuf.pixel_format = VA_FOURCC_P010;
va_attrib_extbuf.pixel_format = fourcc;
va_attrib_extbuf.width = width;
va_attrib_extbuf.height = height;
va_attrib_extbuf.flags = VA_SURFACE_EXTBUF_DESC_ENABLE_TILING;
@ -105,7 +105,7 @@ struct VaapiEncoder
va_attribs[2].type = VASurfaceAttribPixelFormat;
va_attribs[2].flags = VA_SURFACE_ATTRIB_SETTABLE;
va_attribs[2].value.type = VAGenericValueTypeInteger;
va_attribs[2].value.value.i = VA_FOURCC_P010;
va_attribs[2].value.value.i = fourcc;
va_attribs[3].type = VASurfaceAttribExternalBufferDescriptor;
va_attribs[3].flags = VA_SURFACE_ATTRIB_SETTABLE;
va_attribs[3].value.type = VAGenericValueTypePointer;
@ -115,7 +115,7 @@ struct VaapiEncoder
va_attribs[4].value.type = VAGenericValueTypePointer;
va_attribs[4].value.value.p = &modList;
status = vaCreateSurfaces(dpy, VA_RT_FORMAT_YUV420_10,
status = vaCreateSurfaces(dpy, format,
width, height, inputFrames, CHAIN_SIZE,
&va_attribs[0], 5);

View file

@ -5,8 +5,6 @@
#include <cstring>
#include <va/va_enc_hevc.h>
#define USE_P010 1
#define NAL_REF_IDC_NONE 0
#define NAL_REF_IDC_LOW 1
#define NAL_REF_IDC_MEDIUM 2
@ -651,7 +649,7 @@ struct VaapiEncoderHEVC: VaapiEncoder
VAEncSequenceParameterBufferHEVC seq;
VAEncPictureParameterBufferHEVC pic;
VAEncSliceParameterBufferHEVC slice;
void InitParameters()
void InitParameters(bool p010)
{
int width_in_mbs, height_in_mbs;
int frame_cropping_flag = 0;
@ -679,7 +677,7 @@ struct VaapiEncoderHEVC: VaapiEncoder
seq.intra_idr_period = 32767;
seq.intra_period = 32767;
seq.ip_period = 1;
if(USE_P010)
if(p010)
{
seq.seq_fields.bits.bit_depth_chroma_minus8 = 2;
seq.seq_fields.bits.bit_depth_luma_minus8 = 2;
@ -690,7 +688,7 @@ struct VaapiEncoderHEVC: VaapiEncoder
// (none?)
// profile
seq.general_level_idc = 120;
seq.general_profile_idc = USE_P010? 2: 1;
seq.general_profile_idc = p010? PROFILE_IDC_MAIN10: PROFILE_IDC_MAIN;
// pps
pic.pic_fields.bits.dependent_slice_segments_enabled_flag = 1; // seens work both
@ -742,20 +740,22 @@ struct VaapiEncoderHEVC: VaapiEncoder
slice.ref_pic_list1[i].pic_order_cnt = -1;
}
}
bool Setup(int drm_fd, int width, int height, const char *filename, int *dmabuf_fd, uint64_t *mod, uint32_t *size, uint32_t *offset, uint32_t *pitch1, uint32_t *pitch2, uint64_t *modifiers, int modifierscount)
bool Setup(int drm_fd, int width, int height, const char *filename, int *dmabuf_fd, uint64_t *mod, uint32_t *size, uint32_t *offset, uint32_t *pitch1, uint32_t *pitch2, uint64_t *modifiers, int modifierscount, bool p010)
{
VAProfile profile = VAProfileHEVCMain10;
if(!SetupVA(profile, drm_fd, width, height, filename, dmabuf_fd, mod, size, offset, pitch1, pitch2, modifiers, modifierscount))
VAProfile profile = p010?VAProfileHEVCMain10:VAProfileHEVCMain;
uint32_t format = p010?VA_RT_FORMAT_YUV420_10:VA_RT_FORMAT_YUV420;
uint32_t fourcc = p010?VA_FOURCC_P010:VA_FOURCC_NV12;
if(!SetupVA(profile, format, fourcc, drm_fd, width, height, filename, dmabuf_fd, mod, size, offset, pitch1, pitch2, modifiers, modifierscount))
{
VaapiEncoder::Destroy();
return false;
}
if(!CreateContext(profile, VA_RT_FORMAT_YUV420_10, VA_FOURCC_P010, VA_RC_CBR))
if(!CreateContext(profile, format, fourcc, VA_RC_CBR))
{
VaapiEncoder::Destroy();
return false;
}
InitParameters();
InitParameters(p010);
return true;
}

View file

@ -698,14 +698,14 @@ struct ComputeApplication {
}
// create and import dmabuf
void createImageDumbDmabuf2(VkImage &image, VkImageView &imageView, VkDeviceMemory &imageMemory, VkImage &image1, VkImageView &imageView1, VkDeviceMemory &imageMemory1, int fd, uint64_t mod, uint32_t size, uint32_t offset, uint32_t pitch1, uint32_t pitch2) {
void createImageDumbDmabuf2(VkImage &image, VkImageView &imageView, VkDeviceMemory &imageMemory, VkImage &image1, VkImageView &imageView1, VkDeviceMemory &imageMemory1, int fd, uint64_t mod, uint32_t size, uint32_t offset, uint32_t pitch1, uint32_t pitch2, bool p010) {
/*
We will now create a buffer. We will render the mandelbrot set into this buffer
in a computer shade later.
*/
VkImageCreateInfo imageCreateInfo = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO};
imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
imageCreateInfo.format = VK_FORMAT_R16_UNORM;
imageCreateInfo.format = p010?VK_FORMAT_R16_UNORM:VK_FORMAT_R8_UNORM;
imageCreateInfo.extent = { WIDTH, HEIGHT, 1 };
imageCreateInfo.mipLevels = 1;
imageCreateInfo.arrayLayers = 1;
@ -735,7 +735,7 @@ struct ComputeApplication {
VK_CHECK_RESULT(vkCreateImage(device, &imageCreateInfo, NULL, &image)); // create image.
imageCreateInfo.format = VK_FORMAT_R16G16_UNORM;
imageCreateInfo.format = p010?VK_FORMAT_R16G16_UNORM:VK_FORMAT_R8G8_UNORM;
imageCreateInfo.extent = { WIDTH/2, HEIGHT/2, 1 };
layout.offset = 0;//2088960;
layout.rowPitch = pitch2;
@ -792,10 +792,10 @@ struct ComputeApplication {
VkImageViewCreateInfo view = {VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO};
view.image = image;
view.viewType = VK_IMAGE_VIEW_TYPE_2D;
view.format = VK_FORMAT_R16_UNORM;
view.format = p010?VK_FORMAT_R16_UNORM:VK_FORMAT_R8_UNORM;
view.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &imageView));
view.format = VK_FORMAT_R16G16_UNORM;
view.format = p010?VK_FORMAT_R16G16_UNORM:VK_FORMAT_R8G8_UNORM;
view.image = image1;
VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &imageView1));
}
@ -1347,15 +1347,16 @@ struct ComputeApplication {
uint32_t size, offset, pitch1, pitch2;
int fd[CHAIN_SIZE];
uint64_t modifiers[32];
int count = getAvailiableModifiersList(modifiers, 32, VK_FORMAT_R16_UNORM);
bool p010 = true;
int count = getAvailiableModifiersList(modifiers, 32, p010?VK_FORMAT_R16_UNORM:VK_FORMAT_R8_UNORM);
//auto *r = vaapi_recorder_create5(drm_fd, WIDTH, HEIGHT, "out.264", fd, &mod, &size, &offset, &pitch1, &pitch2, modifiers, count);
VaapiEncoderHEVC enc = {};
enc.Setup(drm_fd, WIDTH, HEIGHT, "out.265", fd, &mod, &size, &offset, &pitch1, &pitch2, modifiers, count);
enc.Setup(drm_fd, WIDTH, HEIGHT, "out.265", fd, &mod, &size, &offset, &pitch1, &pitch2, modifiers, count, p010);
for(int i = 0; i < CHAIN_SIZE; i++)
{
createUBO(i);
createImageDumbDmabuf2(chain[i].image0, chain[i].imageView0, chain[i].imageMemory0, chain[i].image1, chain[i].imageView1, chain[i].imageMemory1,
fd[i], mod, size, offset, pitch1, pitch2);
fd[i], mod, size, offset, pitch1, pitch2, p010);
}
createDescriptorSetLayout();