Restore 10 bit switch
This commit is contained in:
parent
a489604278
commit
b9cb95c5e6
4 changed files with 25 additions and 24 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue