dusty-nv / jetson-inference

Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.
https://developer.nvidia.com/embedded/twodaystoademo
MIT License
7.73k stars 2.97k forks source link

Problem of Cuda function for prepocessing the batch images from Videosource #1674

Open LiuZhenshun opened 1 year ago

LiuZhenshun commented 1 year ago

Hi, Sir,

Recently, I would like to inference with batch size bigger than 1, cause i gonna connect several cameras and inference multi batch in once time. I used videosource to get rtsp stream and write a cuda function to prepocess these images, but i got error.

Here is my main function fragment:

uchar3* d_input[2];
if( !input->Capture(&d_input[0], 1000) )
{
    if( !input->IsStreaming() )
        break; 
    LogError("detectnet:  failed to capture video frame\n");
    continue;
}
if( !input->Capture(&d_input[1], 1000) )
{
    if( !input->IsStreaming() )
        break; 
    LogError("detectnet:  failed to capture video frame\n");
    continue;
}
if( CUDA_FAILED(cudaTensorNormMeanRGB(d_input, 2, input->GetWidth(), input->GetHeight(),
                                     outputimage, 128, 128, 
                                     make_float2(0.0f, 1.0f), 
                                     make_float3(0.5f, 0.5f, 0.5f),
                                     make_float3(0.5f, 0.5f, 0.5f), 
                                     stream)) )
{
    printf("detectNet::Detect() -- cudaTensorNormMeanRGB() failed\n");
    return -1;
}

Here is my cuda function:

__global__ void gpuTensorNormMean( uchar3** input, int nImages, int iWidth, 
                                     float** output, int oWidth, int oHeight, 
                                     float2 scale, float multiplier, float min_value, 
                                     const float3 mean, const float3 stdDev )
{
    const int x = blockIdx.x * blockDim.x + threadIdx.x;
    const int y = blockIdx.y * blockDim.y + threadIdx.y;
    const int b = blockIdx.z;  // Batch index

    if( x >= oWidth || y >= oHeight || b >= nImages)
        return;

    const int n = oWidth * oHeight;
    const int m = y * oWidth + x;

    // Offset input/output pointers by batch index
    uchar3* batchInput = input[b]; 
    float* batchOutput = output[b]; 

    const int dx = ((float)x * scale.x);
    const int dy = ((float)y * scale.y);

    const uchar3 px = batchInput[ dy * iWidth + dx ];

    const float3 rgb = make_float3(px.x, px.y, px.z);

    batchOutput[n * 0 + m] = ((rgb.x * multiplier + min_value) - mean.x) / stdDev.x;
    batchOutput[n * 1 + m] = ((rgb.y * multiplier + min_value) - mean.y) / stdDev.y;
    batchOutput[n * 2 + m] = ((rgb.z * multiplier + min_value) - mean.z) / stdDev.z;
}

cudaError_t cudaTensorNormMeanRGB( uchar3** input, int nImages, size_t inputWidth, size_t inputHeight,
                             float** output, size_t outputWidth, size_t outputHeight, 
                             const float2& range, const float3& mean, const float3& stdDev,
                             cudaStream_t stream )
{
    if( !input || !output )
        return cudaErrorInvalidDevicePointer;

    if( inputWidth == 0 || outputWidth == 0 || inputHeight == 0 || outputHeight == 0 )
        return cudaErrorInvalidValue;

    const float2 scale = make_float2( float(inputWidth) / float(outputWidth),
                                float(inputHeight) / float(outputHeight) );

    const float multiplier = (range.y - range.x) / 255.0f;
    printf("%u", input[0][0].x);
    // launch kernel
    const dim3 blockDim(8, 8);
    const dim3 gridDim(iDivUp(outputWidth,blockDim.x), iDivUp(outputHeight,blockDim.y), nImages);

    gpuTensorNormMean<<<gridDim, blockDim, 0, stream>>>((uchar3**)input, nImages, inputWidth, output, outputWidth, outputHeight, scale, multiplier, range.x, mean, stdDev);

    return CUDA(cudaGetLastError());
}

Here is the error:

83
[gstreamer] gstBufferManager -- unsupported image format (rgb8)
[gstreamer]                     supported formats are:
[gstreamer]                        * rgb8
[gstreamer]                        * rgba8
[gstreamer]                        * rgb32f
[gstreamer]                        * rgba32f
[gstreamer] gstDecoder -- failed to retrieve next image buffer
detectnet:  failed to capture video frame
[cuda]      unspecified launch failure (error 719) (hex 0x2CF)
[cuda]      /home/nvidia/jetson-inference-new/utils/cuda/cudaYUV-YV12.cu:119
[cuda]      unspecified launch failure (error 719) (hex 0x2CF)
[cuda]      /home/nvidia/jetson-inference-new/utils/cuda/cudaColorspace.cpp:53
[cuda]      unspecified launch failure (error 719) (hex 0x2CF)
[cuda]      /home/nvidia/jetson-inference-new/utils/codec/gstBufferManager.cpp:383
dusty-nv commented 1 year ago

[gstreamer] gstBufferManager -- unsupported image format (rgb8) [gstreamer] supported formats are: [gstreamer] rgb8 [gstreamer] rgba8 [gstreamer] rgb32f [gstreamer] rgba32f

@LiuZhenshun are you able to run your camera with video-viewer/detectnet without errors, or does this only occur in your customized application?

Can you provide the full console log?

I think that error is emanating from the call to cudaConvertColor() here, but I'm not sure what the exact issue is there, or if perhaps your multi-batch CUDA kernel is causing an error on the GPU which only gets recognized in later CUDA functions.

LiuZhenshun commented 1 year ago

detechnet could be run perfectly and if I annotate the Cuda kernal function, the error is gone.

Here is my full console log:

[gstreamer] initialized gstreamer, version 1.14.5.0
[gstreamer] gstCamera -- attempting to create device v4l2:///dev/video0
[gstreamer] gstCamera -- found v4l2 device: UVC Camera (046d:0825)
[gstreamer] v4l2-proplist, device.path=(string)/dev/video0, udev-probed=(boolean)false, device.api=(string)v4l2, v4l2.device.driver=(string)uvcvideo, v4l2.device.card=(string)"UVC\ Camera\ \(046d:0825\)", v4l2.device.bus_info=(string)usb-70090000.xusb-2.1, v4l2.device.version=(uint)264701, v4l2.device.capabilities=(uint)2216689665, v4l2.device.device_caps=(uint)69206017;
[gstreamer] gstCamera -- found 38 caps for v4l2 device /dev/video0
[gstreamer] [0] video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)960, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 15/2, 5/1 };
[gstreamer] [1] video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 15/2, 5/1 };
[gstreamer] [2] video/x-raw, format=(string)YUY2, width=(int)1184, height=(int)656, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 10/1, 5/1 };
[gstreamer] [3] video/x-raw, format=(string)YUY2, width=(int)960, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 10/1, 5/1 };
[gstreamer] [4] video/x-raw, format=(string)YUY2, width=(int)1024, height=(int)576, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 10/1, 5/1 };
[gstreamer] [5] video/x-raw, format=(string)YUY2, width=(int)960, height=(int)544, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 15/1, 10/1, 5/1 };
[gstreamer] [6] video/x-raw, format=(string)YUY2, width=(int)800, height=(int)600, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [7] video/x-raw, format=(string)YUY2, width=(int)864, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [8] video/x-raw, format=(string)YUY2, width=(int)800, height=(int)448, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [9] video/x-raw, format=(string)YUY2, width=(int)752, height=(int)416, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [10] video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [11] video/x-raw, format=(string)YUY2, width=(int)640, height=(int)360, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [12] video/x-raw, format=(string)YUY2, width=(int)544, height=(int)288, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [13] video/x-raw, format=(string)YUY2, width=(int)432, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [14] video/x-raw, format=(string)YUY2, width=(int)352, height=(int)288, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [15] video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [16] video/x-raw, format=(string)YUY2, width=(int)320, height=(int)176, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [17] video/x-raw, format=(string)YUY2, width=(int)176, height=(int)144, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [18] video/x-raw, format=(string)YUY2, width=(int)160, height=(int)120, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [19] image/jpeg, width=(int)1280, height=(int)960, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [20] image/jpeg, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [21] image/jpeg, width=(int)1184, height=(int)656, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [22] image/jpeg, width=(int)960, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [23] image/jpeg, width=(int)1024, height=(int)576, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [24] image/jpeg, width=(int)960, height=(int)544, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [25] image/jpeg, width=(int)800, height=(int)600, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [26] image/jpeg, width=(int)864, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [27] image/jpeg, width=(int)800, height=(int)448, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [28] image/jpeg, width=(int)752, height=(int)416, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [29] image/jpeg, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [30] image/jpeg, width=(int)640, height=(int)360, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [31] image/jpeg, width=(int)544, height=(int)288, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [32] image/jpeg, width=(int)432, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [33] image/jpeg, width=(int)352, height=(int)288, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [34] image/jpeg, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [35] image/jpeg, width=(int)320, height=(int)176, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [36] image/jpeg, width=(int)176, height=(int)144, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] [37] image/jpeg, width=(int)160, height=(int)120, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };
[gstreamer] gstCamera -- selected device profile:  codec=mjpeg format=unknown width=1280 height=720
[gstreamer] gstCamera pipeline string:
[gstreamer] v4l2src device=/dev/video0 ! image/jpeg, width=(int)1280, height=(int)720 ! jpegdec ! video/x-raw ! appsink name=mysink
[gstreamer] gstCamera successfully created device v4l2:///dev/video0
[video]  created gstCamera from v4l2:///dev/video0
------------------------------------------------
gstCamera video options:
------------------------------------------------
  -- URI: v4l2:///dev/video0
     - protocol:  v4l2
     - location:  /dev/video0
  -- deviceType: v4l2
  -- ioType:     input
  -- codec:      mjpeg
  -- width:      1280
  -- height:     720
  -- frameRate:  30.000000
  -- bitRate:    0
  -- numBuffers: 4
  -- zeroCopy:   true
  -- flipMethod: none
  -- loop:       0
  -- rtspLatency 2000
------------------------------------------------
[OpenGL] glDisplay -- X screen 0 resolution:  1920x1080
[OpenGL] glDisplay -- X window resolution:    1920x1080
[OpenGL] glDisplay -- display device initialized (1920x1080)
[video]  created glDisplay from display://0
------------------------------------------------
glDisplay video options:
------------------------------------------------
  -- URI: display://0
     - protocol:  display
     - location:  0
  -- deviceType: display
  -- ioType:     output
  -- codec:      raw
  -- width:      1920
  -- height:     1080
  -- frameRate:  0.000000
  -- bitRate:    0
  -- numBuffers: 4
  -- zeroCopy:   true
  -- flipMethod: none
  -- loop:       0
  -- rtspLatency 2000
------------------------------------------------
[gstreamer] opening gstCamera for streaming, transitioning pipeline to GST_STATE_PLAYING
[gstreamer] gstreamer changed state from NULL to READY ==> mysink
[gstreamer] gstreamer changed state from NULL to READY ==> capsfilter1
[gstreamer] gstreamer changed state from NULL to READY ==> jpegdec0
[gstreamer] gstreamer changed state from NULL to READY ==> capsfilter0
[gstreamer] gstreamer changed state from NULL to READY ==> v4l2src0
[gstreamer] gstreamer changed state from NULL to READY ==> pipeline0
[gstreamer] gstreamer changed state from READY to PAUSED ==> capsfilter1
[gstreamer] gstreamer changed state from READY to PAUSED ==> jpegdec0
[gstreamer] gstreamer changed state from READY to PAUSED ==> capsfilter0
[gstreamer] gstreamer stream status CREATE ==> src
[gstreamer] gstreamer changed state from READY to PAUSED ==> v4l2src0
[gstreamer] gstreamer changed state from READY to PAUSED ==> pipeline0
[gstreamer] gstreamer stream status ENTER ==> src
[gstreamer] gstreamer message new-clock ==> pipeline0
[gstreamer] gstreamer changed state from PAUSED to PLAYING ==> capsfilter1
[gstreamer] gstreamer changed state from PAUSED to PLAYING ==> jpegdec0
[gstreamer] gstreamer changed state from PAUSED to PLAYING ==> capsfilter0
[gstreamer] gstreamer changed state from PAUSED to PLAYING ==> v4l2src0
[gstreamer] gstreamer message stream-start ==> pipeline0
[gstreamer] gstDecoder -- failed to retrieve next image buffer
detectnet:  failed to capture video frame
[gstreamer] gstDecoder -- failed to retrieve next image buffer
detectnet:  failed to capture video frame
[gstreamer] gstCamera -- onPreroll
[gstreamer] gstBufferManager -- map buffer size was less than max size (1382400 vs 1382407)
[gstreamer] gstBufferManager recieve caps:  video/x-raw, format=(string)I420, width=(int)1280, height=(int)720, interlace-mode=(string)progressive, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)1/1, chroma-site=(string)mpeg2, colorimetry=(string)1:4:0:0, framerate=(fraction)30/1
[gstreamer] gstBufferManager -- recieved first frame, codec=mjpeg format=i420 width=1280 height=720 size=1382407
RingBuffer -- allocated 4 buffers (1382407 bytes each, 5529628 bytes total)
[gstreamer] gstreamer changed state from READY to PAUSED ==> mysink
[gstreamer] gstreamer message async-done ==> pipeline0
[gstreamer] gstreamer changed state from PAUSED to PLAYING ==> mysink
[gstreamer] gstreamer changed state from PAUSED to PLAYING ==> pipeline0
RingBuffer -- allocated 4 buffers (2764800 bytes each, 11059200 bytes total)
[cuda]      unspecified launch failure (error 719) (hex 0x2CF)
[cuda]      /home/nvidia/jetson-inference-new/utils/cuda/cudaYUV-YV12.cu:119
[cuda]      unspecified launch failure (error 719) (hex 0x2CF)
[cuda]      /home/nvidia/jetson-inference-new/utils/cuda/cudaColorspace.cpp:53
[cuda]      unspecified launch failure (error 719) (hex 0x2CF)
[cuda]      /home/nvidia/jetson-inference-new/utils/codec/gstBufferManager.cpp:383
[gstreamer] gstBufferManager -- unsupported image format (rgb8)
[gstreamer]                     supported formats are:
[gstreamer]                        * rgb8
[gstreamer]                        * rgba8
[gstreamer]                        * rgb32f
[gstreamer]                        * rgba32f
[gstreamer] gstDecoder -- failed to retrieve next image buffer
detectnet:  failed to capture video frame

Here is my full main function:

int main( int argc, char** argv )
{
    /*
     * parse command line
     */
    commandLine cmdLine(argc, argv, IS_HEADLESS());

    /*
     * attach signal handler
     */
    if( signal(SIGINT, sig_handler) == SIG_ERR )
        LogError("can't catch SIGINT\n");

    /*
     * create input stream
     */
    videoSource* input = videoSource::Create(cmdLine, ARG_POSITION(0));

    if( !input )
    {
        LogError("detectnet:  failed to create input stream\n");
        return 0;
    }

    /*
     * create output stream
     */
    videoOutput* output = videoOutput::Create(cmdLine, ARG_POSITION(1));

    if( !output )
        LogError("detectnet:  failed to create output stream\n");

        cudaStream_t stream = NULL;
        if( CUDA_FAILED(cudaStreamCreate(&stream)) )
            return -1;

    float* outputimage[2];
    size_t inputSize = 128*128*3;
    cudaMalloc(&outputimage[0], inputSize * sizeof(float));
    cudaMalloc(&outputimage[1], inputSize * sizeof(float));

    uchar3** d_input_h;
    CUDA(cudaMalloc(&d_input_h, 2 * sizeof(uchar3*)));

    /*
     * processing loop
     */
    while( !signal_recieved )
    {
        uchar3* d_input[2];
        if( !input->Capture(&d_input[0], 1000) )
        {
            // check for EOS
            if( !input->IsStreaming() )
                break; 

            LogError("detectnet:  failed to capture video frame\n");
            continue;
        }
        if( !input->Capture(&d_input[1], 1000) )
        {
            // check for EOS
            if( !input->IsStreaming() )
                break; 

            LogError("detectnet:  failed to capture video frame\n");
            continue;
        }

        d_input_h = d_input;

        if( CUDA_FAILED(cudaTensorNormMeanRGB(d_input_h, 2, input->GetWidth(), input->GetHeight(),
                                       outputimage, 128, 128, 
                                       make_float2(0.0f, 1.0f), 
                                       make_float3(0.5f, 0.5f, 0.5f),
                                       make_float3(0.5f, 0.5f, 0.5f), 
                                       stream)) )
        {
            printf("detectNet::Detect() -- cudaTensorNormMeanRGB() failed\n");
            return -1;
        }
    }

    /*
     * destroy resources
     */
    LogVerbose("detectnet:  shutting down...\n");

    SAFE_DELETE(input);

    LogVerbose("detectnet:  shutdown complete.\n");
    return 0;
}
dusty-nv commented 1 year ago

@LiuZhenshun after reviewing your CUDA kernel, I'm not exactly sure where it goes wrong, but I'm guessing it's something with the image array indexing and perhaps your kernel accessing an invalid memory address. You could try adding printf statements to your kernel to debug it.

In the larger scheme though, I don't think you will gain a large performance advantage since the images are still being processed pretty much independently (since they are indexed by blockIdx.z). Instead, I would probably just go back to using the original preprocessing function and calling it twice. The overhead of launching separate CUDA kernels is marginal compared to the memory accesses, and even so it's small in comparison to the execution time of the actual DNN.

Also, the jetson-inference detectNet class itself doesn't support multi-image batching in the post-processing either (i.e. in the clustering of the bounding boxes), so that would be another large set of modifications to be made. For batch inferencing, I would recommend that you check out DeepStream as it is optimized for that.

LiuZhenshun commented 1 year ago

@dusty-nv Thanks for your suggestions, I will try to use DeepStream later. Could you please explain why adding the blockIdx.z could not take advantage of parallel computing? Adding the Z dimension means more threads would process the batch images at the same time, why it would compromise the performance?

dusty-nv commented 1 year ago

@LiuZhenshun it does have benefits as you say, however you would need to be careful about the striding / coalesced memory accesses to have optimal performance and you may already have enough threads running where you meet diminishing returns. Basically the way you have it, is basically equivalent to launching independent kernels. That's not to say that batch pre-processing of your images isn't good - it likely is - however the question is it worth the effort? Pre-processing already represents a small percentage of overall execution time.

LiuZhenshun commented 1 year ago

@dusty-nv I get it. Thanks for your explanation.

encouver commented 1 year ago

Hello,

I got this error as well. I got a new Jetson Orin Nano 8gb, and connected my Logitech webcam c922 pro to the jetson through usb.

Following this video: https://www.youtube.com/watch?v=QXIwdsyK7Rw

I got to the part where i execute: video-viewer /dev/video0.

And this error that is very similar to this issue appears:

[cuda] allocated 4 ring buffers (8 bytes each, 32 bytes total) [gstreamer] gstreamer changed state from READY to PAUSED ==> mysink [gstreamer] gstreamer message async-done ==> pipeline0 [gstreamer] gstreamer changed state from PAUSED to PLAYING ==> mysink [gstreamer] gstreamer changed state from PAUSED to PLAYING ==> pipeline0 [cuda] allocated 4 ring buffers (2764800 bytes each, 11059200 bytes total) video-viewer: captured 0 frames (1280x720) [OpenGL] glDisplay -- set the window size to 1280x720 [OpenGL] creating 1280x720 texture (GL_RGB8 format, 2764800 bytes) [cuda] cudaGraphicsGLRegisterBuffer(&interop, allocDMA(type), cudaGraphicsRegisterFlagsFromGL(flags)) [cuda] unknown error (error 999) (hex 0x3E7) [cuda] /jetson-inference/utils/display/glTexture.cpp:360 [cuda] cudaGetLastError() [cuda] unknown error (error 999) (hex 0x3E7) [cuda] /jetson-inference/utils/cuda/cudaYUV-YV12.cu:119 [cuda] cudaI420ToRGB(input, (uchar3)output, width, height) [cuda] unknown error (error 999) (hex 0x3E7) [cuda] /jetson-inference/utils/cuda/cudaColorspace.cpp:53 [cuda] cudaConvertColor(latestYUV, mFormatYUV, nextRGB, format, mOptions->width, mOptions->height) [cuda] unknown error (error 999) (hex 0x3E7) [cuda] /jetson-inference/utils/codec/gstBufferManager.cpp:445 [gstreamer] gstBufferManager -- unsupported image format (rgb8) [gstreamer] supported formats are: [gstreamer] rgb8 [gstreamer] rgba8 [gstreamer] rgb32f [gstreamer] * rgba32f [gstreamer] gstCamera::Capture() -- an error occurred retrieving the next image buffer video-viewer: shutting down... [gstreamer] gstCamera -- stopping pipeline, transitioning to GST_STATE_NULL [gstreamer] gstCamera -- pipeline stopped video-viewer: shutdown complete

What could be happening?

dusty-nv commented 1 year ago

[cuda] cudaGraphicsGLRegisterBuffer(&interop, allocDMA(type), cudaGraphicsRegisterFlagsFromGL(flags)) [cuda] unknown error (error 999) (hex 0x3E7)

@encouver do you have a physical display attached to your Jetson, or are you using remote X11-forwarding / SSH-tunneling?

Only the former case will work since this is using CUDA/OpenGL interop.

The other case that CUDA/OpenGL interop could fail, is if your NVIDIA OpenGL driver somehow got replaced (i.e. by mesa or SGI graphics driver). What is the output of running glxinfo? (from the mesa-utils package)

encouver commented 1 year ago

[cuda] cudaGraphicsGLRegisterBuffer(&interop, allocDMA(type), cudaGraphicsRegisterFlagsFromGL(flags)) [cuda] unknown error (error 999) (hex 0x3E7)

@encouver do you have a physical display attached to your Jetson, or are you using remote X11-forwarding / SSH-tunneling?

Only the former case will work since this is using CUDA/OpenGL interop.

The other case that CUDA/OpenGL interop could fail, is if your NVIDIA OpenGL driver somehow got replaced (i.e. by mesa or SGI graphics driver). What is the output of running glxinfo? (from the mesa-utils package)

No, i don't have a physical display attached, i am using remote what i would guess is X11-forwarding(using vnc viewer) and also ssh.

This is the output from glxinfo:

root@encouver-desktop:/jetson-inference# glxinfo name of display: :0 display: :0 screen: 0 direct rendering: Yes server glx vendor string: SGI server glx version string: 1.4 server glx extensions: GLX_ARB_context_flush_control, GLX_ARB_create_context, GLX_ARB_create_context_no_error, GLX_ARB_create_context_profile, GLX_ARB_fbconfig_float, GLX_ARB_framebuffer_sRGB, GLX_ARB_multisample, GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float, GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_libglvnd, GLX_EXT_no_config_context, GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_copy_sub_buffer, GLX_OML_swap_method, GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group, GLX_SGI_make_current_read client glx vendor string: Mesa Project and SGI client glx version string: 1.4 client glx extensions: GLX_ARB_context_flush_control, GLX_ARB_create_context, GLX_ARB_create_context_no_error, GLX_ARB_create_context_profile, GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float, GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_ATI_pixel_format_float, GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float, GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_no_config_context, GLX_EXT_swap_control, GLX_EXT_swap_control_tear, GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_INTEL_swap_event, GLX_MESA_copy_sub_buffer, GLX_MESA_multithread_makecurrent, GLX_MESA_query_renderer, GLX_MESA_swap_control, GLX_NV_float_buffer, GLX_OML_swap_method, GLX_OML_sync_control, GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group, GLX_SGI_make_current_read, GLX_SGI_swap_control, GLX_SGI_video_sync GLX version: 1.4 GLX extensions: GLX_ARB_context_flush_control, GLX_ARB_create_context, GLX_ARB_create_context_no_error, GLX_ARB_create_context_profile, GLX_ARB_fbconfig_float, GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float, GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_no_config_context, GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_copy_sub_buffer, GLX_MESA_query_renderer, GLX_OML_swap_method, GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group, GLX_SGI_make_current_read Extended renderer info (GLX_MESA_query_renderer): Vendor: Mesa/X.org (0xffffffff) Device: llvmpipe (LLVM 12.0.0, 128 bits) (0xffffffff) Version: 21.2.6 Accelerated: no Video memory: 6480MB Unified memory: no Preferred profile: core (0x1) Max core profile version: 4.5 Max compat profile version: 3.1 Max GLES1 profile version: 1.1 Max GLES[23] profile version: 3.2 OpenGL vendor string: Mesa/X.org OpenGL renderer string: llvmpipe (LLVM 12.0.0, 128 bits) OpenGL core profile version string: 4.5 (Core Profile) Mesa 21.2.6 OpenGL core profile shading language version string: 4.50 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: GL_3DFX_texture_compression_FXT1, GL_AMD_conservative_depth, GL_AMD_draw_buffers_blend, GL_AMD_gpu_shader_int64, GL_AMD_multi_draw_indirect, GL_AMD_query_buffer_object, GL_AMD_seamless_cubemap_per_texture, GL_AMD_shader_stencil_export, GL_AMD_shader_trinary_minmax, GL_AMD_texture_texture4, GL_AMD_vertex_shader_layer, GL_AMD_vertex_shader_viewport_index, GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5, GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility, GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility, GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_blend_func_extended, GL_ARB_buffer_storage, GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control, GL_ARB_compressed_texture_pixel_storage, GL_ARB_compute_shader, GL_ARB_conditional_render_inverted, GL_ARB_conservative_depth, GL_ARB_copy_buffer, GL_ARB_copy_image, GL_ARB_cull_distance, GL_ARB_debug_output, GL_ARB_depth_buffer_float, GL_ARB_depth_clamp, GL_ARB_derivative_control, GL_ARB_direct_state_access, GL_ARB_draw_buffers, GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex, GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts, GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location, GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport, GL_ARB_fragment_shader, GL_ARB_framebuffer_no_attachments, GL_ARB_framebuffer_object, GL_ARB_framebuffer_sRGB, GL_ARB_get_program_binary, GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv, GL_ARB_gpu_shader5, GL_ARB_gpu_shader_fp64, GL_ARB_gpu_shader_int64, GL_ARB_half_float_pixel, GL_ARB_half_float_vertex, GL_ARB_indirect_parameters, GL_ARB_instanced_arrays, GL_ARB_internalformat_query, GL_ARB_internalformat_query2, GL_ARB_invalidate_subdata, GL_ARB_map_buffer_alignment, GL_ARB_map_buffer_range, GL_ARB_multi_bind, GL_ARB_multi_draw_indirect, GL_ARB_occlusion_query2, GL_ARB_parallel_shader_compile, GL_ARB_pipeline_statistics_query, GL_ARB_pixel_buffer_object, GL_ARB_point_sprite, GL_ARB_polygon_offset_clamp, GL_ARB_post_depth_coverage, GL_ARB_program_interface_query, GL_ARB_provoking_vertex, GL_ARB_query_buffer_object, GL_ARB_robust_buffer_access_behavior, GL_ARB_robustness, GL_ARB_sample_shading, GL_ARB_sampler_objects, GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture, GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops, GL_ARB_shader_atomic_counters, GL_ARB_shader_bit_encoding, GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote, GL_ARB_shader_image_load_store, GL_ARB_shader_image_size, GL_ARB_shader_objects, GL_ARB_shader_precision, GL_ARB_shader_stencil_export, GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine, GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod, GL_ARB_shader_viewport_layer_array, GL_ARB_shading_language_420pack, GL_ARB_shading_language_include, GL_ARB_shading_language_packing, GL_ARB_spirv_extensions, GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_tessellation_shader, GL_ARB_texture_barrier, GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32, GL_ARB_texture_buffer_range, GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc, GL_ARB_texture_cube_map_array, GL_ARB_texture_filter_minmax, GL_ARB_texture_float, GL_ARB_texture_gather, GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two, GL_ARB_texture_query_levels, GL_ARB_texture_query_lod, GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui, GL_ARB_texture_stencil8, GL_ARB_texture_storage, GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle, GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2, GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced, GL_ARB_transform_feedback_overflow_query, GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra, GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_64bit, GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object, GL_ARB_vertex_shader, GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev, GL_ARB_viewport_array, GL_ATI_blend_equation_separate, GL_ATI_texture_float, GL_ATI_texture_mirror_once, GL_EXT_EGL_image_storage, GL_EXT_EGL_sync, GL_EXT_abgr, GL_EXT_blend_equation_separate, GL_EXT_draw_buffers2, GL_EXT_draw_instanced, GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample, GL_EXT_framebuffer_multisample_blit_scaled, GL_EXT_framebuffer_object, GL_EXT_framebuffer_sRGB, GL_EXT_packed_depth_stencil, GL_EXT_packed_float, GL_EXT_pixel_buffer_object, GL_EXT_polygon_offset_clamp, GL_EXT_provoking_vertex, GL_EXT_shader_framebuffer_fetch_non_coherent, GL_EXT_shader_integer_mix, GL_EXT_texture_array, GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, GL_EXT_texture_filter_minmax, GL_EXT_texture_integer, GL_EXT_texture_mirror_clamp, GL_EXT_texture_sRGB, GL_EXT_texture_sRGB_R8, GL_EXT_texture_sRGB_decode, GL_EXT_texture_shadow_lod, GL_EXT_texture_shared_exponent, GL_EXT_texture_snorm, GL_EXT_texture_swizzle, GL_EXT_timer_query, GL_EXT_transform_feedback, GL_EXT_vertex_array_bgra, GL_EXT_vertex_attrib_64bit, GL_IBM_multimode_draw_arrays, GL_KHR_blend_equation_advanced, GL_KHR_context_flush_control, GL_KHR_debug, GL_KHR_no_error, GL_KHR_parallel_shader_compile, GL_KHR_robust_buffer_access_behavior, GL_KHR_robustness, GL_KHR_texture_compression_astc_ldr, GL_KHR_texture_compression_astc_sliced_3d, GL_MESA_framebuffer_flip_y, GL_MESA_pack_invert, GL_MESA_shader_integer_functions, GL_MESA_texture_signed_rgba, GL_MESA_ycbcr_texture, GL_NV_conditional_render, GL_NV_copy_image, GL_NV_depth_clamp, GL_NV_packed_depth_stencil, GL_NV_texture_barrier, GL_OES_EGL_image, GL_S3_s3tc

OpenGL version string: 3.1 Mesa 21.2.6 OpenGL shading language version string: 1.40 OpenGL context flags: (none) OpenGL extensions: GL_3DFX_texture_compression_FXT1, GL_AMD_conservative_depth, GL_AMD_draw_buffers_blend, GL_AMD_multi_draw_indirect, GL_AMD_query_buffer_object, GL_AMD_seamless_cubemap_per_texture, GL_AMD_shader_stencil_export, GL_AMD_shader_trinary_minmax, GL_AMD_texture_texture4, GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5, GL_APPLE_packed_pixels, GL_ARB_ES2_compatibility, GL_ARB_ES3_compatibility, GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_blend_func_extended, GL_ARB_buffer_storage, GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control, GL_ARB_color_buffer_float, GL_ARB_compatibility, GL_ARB_compressed_texture_pixel_storage, GL_ARB_compute_shader, GL_ARB_conditional_render_inverted, GL_ARB_conservative_depth, GL_ARB_copy_buffer, GL_ARB_copy_image, GL_ARB_cull_distance, GL_ARB_debug_output, GL_ARB_depth_buffer_float, GL_ARB_depth_clamp, GL_ARB_depth_texture, GL_ARB_derivative_control, GL_ARB_direct_state_access, GL_ARB_draw_buffers, GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex, GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts, GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location, GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport, GL_ARB_fragment_program, GL_ARB_fragment_program_shadow, GL_ARB_fragment_shader, GL_ARB_framebuffer_no_attachments, GL_ARB_framebuffer_object, GL_ARB_framebuffer_sRGB, GL_ARB_get_program_binary, GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv, GL_ARB_half_float_pixel, GL_ARB_half_float_vertex, GL_ARB_indirect_parameters, GL_ARB_instanced_arrays, GL_ARB_internalformat_query, GL_ARB_internalformat_query2, GL_ARB_invalidate_subdata, GL_ARB_map_buffer_alignment, GL_ARB_map_buffer_range, GL_ARB_multi_bind, GL_ARB_multi_draw_indirect, GL_ARB_multisample, GL_ARB_multitexture, GL_ARB_occlusion_query, GL_ARB_occlusion_query2, GL_ARB_parallel_shader_compile, GL_ARB_pipeline_statistics_query, GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite, GL_ARB_polygon_offset_clamp, GL_ARB_post_depth_coverage, GL_ARB_program_interface_query, GL_ARB_provoking_vertex, GL_ARB_query_buffer_object, GL_ARB_robust_buffer_access_behavior, GL_ARB_robustness, GL_ARB_sample_shading, GL_ARB_sampler_objects, GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture, GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops, GL_ARB_shader_atomic_counters, GL_ARB_shader_bit_encoding, GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote, GL_ARB_shader_image_load_store, GL_ARB_shader_image_size, GL_ARB_shader_objects, GL_ARB_shader_stencil_export, GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine, GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod, GL_ARB_shading_language_100, GL_ARB_shading_language_420pack, GL_ARB_shading_language_include, GL_ARB_shading_language_packing, GL_ARB_shadow, GL_ARB_spirv_extensions, GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_texture_barrier, GL_ARB_texture_border_clamp, GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32, GL_ARB_texture_buffer_range, GL_ARB_texture_compression, GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc, GL_ARB_texture_cube_map, GL_ARB_texture_cube_map_array, GL_ARB_texture_env_add, GL_ARB_texture_env_combine, GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3, GL_ARB_texture_filter_minmax, GL_ARB_texture_float, GL_ARB_texture_gather, GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_mirrored_repeat, GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two, GL_ARB_texture_query_levels, GL_ARB_texture_query_lod, GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui, GL_ARB_texture_stencil8, GL_ARB_texture_storage, GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle, GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2, GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced, GL_ARB_transform_feedback_overflow_query, GL_ARB_transpose_matrix, GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra, GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object, GL_ARB_vertex_program, GL_ARB_vertex_shader, GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev, GL_ARB_viewport_array, GL_ARB_window_pos, GL_ATI_blend_equation_separate, GL_ATI_draw_buffers, GL_ATI_fragment_shader, GL_ATI_separate_stencil, GL_ATI_texture_compression_3dc, GL_ATI_texture_env_combine3, GL_ATI_texture_float, GL_ATI_texture_mirror_once, GL_EXT_EGL_image_storage, GL_EXT_EGL_sync, GL_EXT_abgr, GL_EXT_bgra, GL_EXT_blend_color, GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate, GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_compiled_vertex_array, GL_EXT_copy_texture, GL_EXT_direct_state_access, GL_EXT_draw_buffers2, GL_EXT_draw_instanced, GL_EXT_draw_range_elements, GL_EXT_fog_coord, GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample, GL_EXT_framebuffer_multisample_blit_scaled, GL_EXT_framebuffer_object, GL_EXT_framebuffer_sRGB, GL_EXT_gpu_program_parameters, GL_EXT_gpu_shader4, GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil, GL_EXT_packed_float, GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object, GL_EXT_point_parameters, GL_EXT_polygon_offset_clamp, GL_EXT_provoking_vertex, GL_EXT_rescale_normal, GL_EXT_secondary_color, GL_EXT_separate_specular_color, GL_EXT_shader_framebuffer_fetch_non_coherent, GL_EXT_shader_integer_mix, GL_EXT_shadow_funcs, GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, GL_EXT_subtexture, GL_EXT_texture, GL_EXT_texture3D, GL_EXT_texture_array, GL_EXT_texture_buffer_object, GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_latc, GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, GL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp, GL_EXT_texture_env_add, GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3, GL_EXT_texture_filter_minmax, GL_EXT_texture_integer, GL_EXT_texture_lod_bias, GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, GL_EXT_texture_rectangle, GL_EXT_texture_sRGB, GL_EXT_texture_sRGB_R8, GL_EXT_texture_sRGB_decode, GL_EXT_texture_shadow_lod, GL_EXT_texture_shared_exponent, GL_EXT_texture_snorm, GL_EXT_texture_swizzle, GL_EXT_timer_query, GL_EXT_transform_feedback, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra, GL_IBM_multimode_draw_arrays, GL_IBM_rasterpos_clip, GL_IBM_texture_mirrored_repeat, GL_INGR_blend_func_separate, GL_KHR_blend_equation_advanced, GL_KHR_context_flush_control, GL_KHR_debug, GL_KHR_no_error, GL_KHR_parallel_shader_compile, GL_KHR_robust_buffer_access_behavior, GL_KHR_robustness, GL_KHR_texture_compression_astc_ldr, GL_KHR_texture_compression_astc_sliced_3d, GL_MESA_pack_invert, GL_MESA_shader_integer_functions, GL_MESA_texture_signed_rgba, GL_MESA_window_pos, GL_MESA_ycbcr_texture, GL_NV_blend_square, GL_NV_conditional_render, GL_NV_copy_depth_to_color, GL_NV_copy_image, GL_NV_depth_clamp, GL_NV_fog_distance, GL_NV_half_float, GL_NV_light_max_exponent, GL_NV_packed_depth_stencil, GL_NV_primitive_restart, GL_NV_texgen_reflection, GL_NV_texture_barrier, GL_NV_texture_env_combine4, GL_NV_texture_rectangle, GL_OES_EGL_image, GL_OES_read_format, GL_S3_s3tc, GL_SGIS_generate_mipmap, GL_SGIS_texture_border_clamp, GL_SGIS_texture_edge_clamp, GL_SGIS_texture_lod, GL_SUN_multi_draw_arrays

OpenGL ES profile version string: OpenGL ES 3.2 Mesa 21.2.6 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20 OpenGL ES profile extensions: GL_ANDROID_extension_pack_es31a, GL_ANGLE_pack_reverse_row_order, GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5, GL_APPLE_texture_max_level, GL_EXT_EGL_image_storage, GL_EXT_base_instance, GL_EXT_blend_func_extended, GL_EXT_blend_minmax, GL_EXT_buffer_storage, GL_EXT_clip_control, GL_EXT_clip_cull_distance, GL_EXT_color_buffer_float, GL_EXT_color_buffer_half_float, GL_EXT_compressed_ETC1_RGB8_sub_texture, GL_EXT_copy_image, GL_EXT_depth_clamp, GL_EXT_discard_framebuffer, GL_EXT_disjoint_timer_query, GL_EXT_draw_buffers, GL_EXT_draw_buffers_indexed, GL_EXT_draw_elements_base_vertex, GL_EXT_draw_instanced, GL_EXT_float_blend, GL_EXT_frag_depth, GL_EXT_geometry_point_size, GL_EXT_geometry_shader, GL_EXT_gpu_shader5, GL_EXT_map_buffer_range, GL_EXT_multi_draw_arrays, GL_EXT_occlusion_query_boolean, GL_EXT_polygon_offset_clamp, GL_EXT_primitive_bounding_box, GL_EXT_read_format_bgra, GL_EXT_render_snorm, GL_EXT_robustness, GL_EXT_sRGB_write_control, GL_EXT_separate_shader_objects, GL_EXT_shader_framebuffer_fetch_non_coherent, GL_EXT_shader_group_vote, GL_EXT_shader_implicit_conversions, GL_EXT_shader_integer_mix, GL_EXT_shader_io_blocks, GL_EXT_tessellation_point_size, GL_EXT_tessellation_shader, GL_EXT_texture_border_clamp, GL_EXT_texture_buffer, GL_EXT_texture_compression_bptc, GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, GL_EXT_texture_compression_s3tc_srgb, GL_EXT_texture_cube_map_array, GL_EXT_texture_filter_minmax, GL_EXT_texture_format_BGRA8888, GL_EXT_texture_norm16, GL_EXT_texture_query_lod, GL_EXT_texture_rg, GL_EXT_texture_sRGB_R8, GL_EXT_texture_sRGB_RG8, GL_EXT_texture_sRGB_decode, GL_EXT_texture_shadow_lod, GL_EXT_texture_type_2_10_10_10_REV, GL_EXT_texture_view, GL_EXT_unpack_subimage, GL_KHR_blend_equation_advanced, GL_KHR_context_flush_control, GL_KHR_debug, GL_KHR_no_error, GL_KHR_parallel_shader_compile, GL_KHR_robust_buffer_access_behavior, GL_KHR_robustness, GL_KHR_texture_compression_astc_ldr, GL_KHR_texture_compression_astc_sliced_3d, GL_MESA_bgra, GL_MESA_framebuffer_flip_y, GL_MESA_shader_integer_functions, GL_NV_conditional_render, GL_NV_draw_buffers, GL_NV_fbo_color_attachments, GL_NV_image_formats, GL_NV_pixel_buffer_object, GL_NV_read_buffer, GL_NV_read_depth, GL_NV_read_depth_stencil, GL_NV_read_stencil, GL_OES_EGL_image, GL_OES_EGL_image_external, GL_OES_EGL_image_external_essl3, GL_OES_EGL_sync, GL_OES_compressed_ETC1_RGB8_texture, GL_OES_copy_image, GL_OES_depth24, GL_OES_depth_texture, GL_OES_depth_texture_cube_map, GL_OES_draw_buffers_indexed, GL_OES_draw_elements_base_vertex, GL_OES_element_index_uint, GL_OES_fbo_render_mipmap, GL_OES_geometry_point_size, GL_OES_geometry_shader, GL_OES_get_program_binary, GL_OES_gpu_shader5, GL_OES_mapbuffer, GL_OES_packed_depth_stencil, GL_OES_primitive_bounding_box, GL_OES_required_internalformat, GL_OES_rgb8_rgba8, GL_OES_sample_shading, GL_OES_sample_variables, GL_OES_shader_image_atomic, GL_OES_shader_io_blocks, GL_OES_shader_multisample_interpolation, GL_OES_standard_derivatives, GL_OES_stencil8, GL_OES_surfaceless_context, GL_OES_tessellation_point_size, GL_OES_tessellation_shader, GL_OES_texture_3D, GL_OES_texture_border_clamp, GL_OES_texture_buffer, GL_OES_texture_cube_map_array, GL_OES_texture_float, GL_OES_texture_float_linear, GL_OES_texture_half_float, GL_OES_texture_half_float_linear, GL_OES_texture_npot, GL_OES_texture_stencil8, GL_OES_texture_storage_multisample_2d_array, GL_OES_texture_view, GL_OES_vertex_array_object, GL_OES_vertex_half_float, GL_OES_viewport_array

390 GLX Visuals visual x bf lv rg d st colorbuffer sr ax dp st accumbuffer ms cav id dep cl sp sz l ci b ro r g b a F gb bf th cl r g b a ns b eat

0x021 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None 0x022 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None 0x38b 24 tc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None 0x38c 24 tc 0 32 0 r . . 8 8 8 8 . . 0 0 0 16 16 16 16 0 0 Slow 0x38d 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None 0x38e 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 16 16 16 16 0 0 Slow 0x38f 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None 0x390 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 16 16 16 16 0 0 Slow 0x391 24 tc 0 32 0 r . . 8 8 8 8 . . 0 16 0 0 0 0 0 0 0 None 0x392 24 tc 0 32 0 r . . 8 8 8 8 . . 0 16 0 16 16 16 16 0 0 Slow 0x393 24 tc 0 32 0 r y . 8 8 8 8 . . 0 16 0 0 0 0 0 0 0 None 0x394 24 tc 0 32 0 r y . 8 8 8 8 . . 0 16 0 16 16 16 16 0 0 Slow 0x395 24 tc 0 32 0 r y . 8 8 8 8 . . 0 16 0 0 0 0 0 0 0 None 0x396 24 tc 0 32 0 r y . 8 8 8 8 . . 0 16 0 16 16 16 16 0 0 Slow 0x397 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 0 0 0 0 0 0 0 None 0x398 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 0 16 16 16 16 0 0 Slow 0x399 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 0 0 0 0 0 0 0 None 0x39a 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 0 16 16 16 16 0 0 Slow 0x39b 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 0 0 0 0 0 0 0 None 0x39c 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 0 16 16 16 16 0 0 Slow 0x39d 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None 0x39e 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 Slow 0x39f 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 Slow 0x3a0 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None 0x3a1 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 Slow 0x3a2 24 tc 0 32 0 r . . 8 8 8 8 . . 0 32 0 0 0 0 0 0 0 None 0x3a3 24 tc 0 32 0 r . . 8 8 8 8 . . 0 32 0 16 16 16 16 0 0 Slow 0x3a4 24 tc 0 32 0 r y . 8 8 8 8 . . 0 32 0 0 0 0 0 0 0 None 0x3a5 24 tc 0 32 0 r y . 8 8 8 8 . . 0 32 0 16 16 16 16 0 0 Slow 0x3a6 24 tc 0 32 0 r y . 8 8 8 8 . . 0 32 0 0 0 0 0 0 0 None 0x3a7 24 tc 0 32 0 r y . 8 8 8 8 . . 0 32 0 16 16 16 16 0 0 Slow 0x3a8 24 tc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 4 1 None 0x3a9 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 4 1 None 0x3aa 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 4 1 None 0x3ab 24 tc 0 32 0 r . . 8 8 8 8 . . 0 16 0 0 0 0 0 4 1 None 0x3ac 24 tc 0 32 0 r y . 8 8 8 8 . . 0 16 0 0 0 0 0 4 1 None 0x3ad 24 tc 0 32 0 r y . 8 8 8 8 . . 0 16 0 0 0 0 0 4 1 None 0x3ae 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 0 0 0 0 0 4 1 None 0x3af 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 0 0 0 0 0 4 1 None 0x3b0 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 0 0 0 0 0 4 1 None 0x3b1 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 4 1 None 0x3b2 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 4 1 None