У меня мультидисплейная система, 27 дюймов (2560 x 1440) и Apple Cinema Display (1920 x 1200) с видеокартой ATI Radeon HD 5750 1024 МБ.Раньше я мог снимать скриншоты с моего предыдущего iMac с картой Nvidia, также с мультидисплейными системами.Теперь я получаю сообщение об ошибке OpenGL.
Эта GDB была настроена как "x86_64-apple-darwin" .tty / dev / ttys001 [Переключение на процесс 28434 поток 0x0] 2011-08-20 19:07.OpenGLScreenReader.m: 230 2011-08-20 19: 07: 42.043 DetectObjectColor [28434: c03] * Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Ошибка OpenGL 0x0506»
Я вызываю это из моей основной программы:
OpenGLScreenReader *mOpenGLScreenReader;
mOpenGLScreenReader = [[OpenGLScreenReader alloc] init];
[mOpenGLScreenReader readRectScreen:CGRectMake(570, 265, 35, 800)];
Это мой метод инициализации
-(id) init
{
if (self = [super init])
{
// Create a full-screen OpenGL graphics context
// Specify attributes of the GL graphics context
NSOpenGLPixelFormatAttribute attributes[] = {
NSOpenGLPFANoRecovery,
NSOpenGLPFAFullScreen,
NSOpenGLPFAScreenMask,
CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay),
(NSOpenGLPixelFormatAttribute) 0
};
NSOpenGLPixelFormat *glPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
if (!glPixelFormat)
{
return nil;
}
// Create OpenGL context used to render
mGLContext = [[[NSOpenGLContext alloc] initWithFormat:glPixelFormat shareContext:nil] autorelease];
// Cleanup, pixel format object no longer needed
[glPixelFormat release];
if (!mGLContext)
{
[self release];
return nil;
}
[mGLContext retain];
// Set our context as the current OpenGL context
[mGLContext makeCurrentContext];
// Set full-screen mode
[mGLContext setFullScreen];
NSRect mainScreenRect = [[NSScreen mainScreen] frame];
mWidth = mainScreenRect.size.width;
mHeight = mainScreenRect.size.height;
mByteWidth = mWidth * 4; // Assume 4 bytes/pixel for now
mByteWidth = (mByteWidth + 3) & ~3; // Align to 4 bytes
mData = malloc(mByteWidth * mHeight);
NSAssert( mData != 0, @"malloc failed");
}
return self;
}
Это мой метод readRectScreen, который выдает мне ошибку в OpenGL, когда он выполняет readPartialScreenToBuffermethod
- (void) readRectScreen:(CGRect) srcRect
{
mWidth = srcRect.size.width;
mHeight = srcRect.size.height;
mByteWidth = mWidth * 4; // Assume 4 bytes/pixel for now
mByteWidth = (mByteWidth + 3) & ~3; // Align to 4 bytes
mData = malloc(mByteWidth * mHeight);
[self readPartialScreenToBuffer:srcRect bufferBaseAddress: mData];
}
- (void) readPartialScreenToBuffer: (CGRect) srcRect bufferBaseAddress: (void *) baseAddress
{
// select front buffer as our source for pixel data
GLint width, height;
width = srcRect.size.width;
height = srcRect.size.height;
glReadBuffer(GL_FRONT);
//Read OpenGL context pixels directly.
// For extra safety, save & restore OpenGL states that are changed
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
glPixelStorei(GL_PACK_ALIGNMENT, 4); /* Force 4-byte alignment */
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
//Read a block of pixels from the frame buffer
glReadPixels((GLint)srcRect.origin.x, (GLint)srcRect.origin.y, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,baseAddress);
glPopClientAttrib();
//Check for OpenGL errors
GLenum theError = GL_NO_ERROR;
theError = glGetError();
NSAssert1( theError == GL_NO_ERROR, @"OpenGL error 0x%04X", theError);
}
Может кто-нибудь помочь, пожалуйста ... Я совершенно заблудился в том, где может быть ошибка.