mujoco_py/gl/osmesashim.c (54 lines of code) (raw):

#include <GL/osmesa.h> #include "glshim.h" OSMesaContext ctx; // this size was picked pretty arbitrarily int BUFFER_WIDTH = 1024; int BUFFER_HEIGHT = 1024; // 4 channels for RGBA unsigned char buffer[1024 * 1024 * 4]; int is_initialized = 0; int usingEGL() { return 0; } int initOpenGL(int device_id) { if (is_initialized) return 1; // note: device id not used here ctx = OSMesaCreateContextExt(GL_RGBA, 24, 8, 8, 0); if( !ctx ) { printf("OSMesa context creation failed\n"); return -1; } if( !OSMesaMakeCurrent(ctx, buffer, GL_UNSIGNED_BYTE, BUFFER_WIDTH, BUFFER_HEIGHT) ) { printf("OSMesa make current failed\n"); return -1; } is_initialized = 1; return 1; } int makeOpenGLContextCurrent(int device_id) { // Don't need to make context current here, causes issues with large tests return 1; } int setOpenGLBufferSize(int device_id, int width, int height) { if (width > BUFFER_WIDTH || height > BUFFER_HEIGHT) { printf("Buffer size too big\n"); return -1; } // Noop since we don't support changing the actual buffer return 1; } void closeOpenGL() { if (is_initialized) { OSMesaDestroyContext(ctx); is_initialized = 0; } } unsigned int createPBO(int width, int height, int batchSize, int use_short) { return 0; } void freePBO(unsigned int pixelBuffer) { } void copyFBOToPBO(mjrContext* con, unsigned int pbo_rgb, unsigned int pbo_depth, mjrRect viewport, int bufferOffset) { } void readPBO(unsigned char *buffer_rgb, unsigned short *buffer_depth, unsigned int pbo_rgb, unsigned int pbo_depth, int width, int height, int batchSize) { }