From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1DaHDi-0006J9-3Y for qemu-devel@nongnu.org; Mon, 23 May 2005 14:00:06 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1DaHDh-0006Iv-Eh for qemu-devel@nongnu.org; Mon, 23 May 2005 14:00:05 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1DaHAN-0004tr-0X for qemu-devel@nongnu.org; Mon, 23 May 2005 13:56:39 -0400 Received: from [64.233.184.205] (helo=wproxy.gmail.com) by monty-python.gnu.org with esmtp (Exim 4.34) id 1DaGvD-0008E0-0t for qemu-devel@nongnu.org; Mon, 23 May 2005 13:40:59 -0400 Received: by wproxy.gmail.com with SMTP id 71so1972604wra for ; Mon, 23 May 2005 10:31:29 -0700 (PDT) Mime-Version: 1.0 (Apple Message framework v622) Content-Transfer-Encoding: 7bit Message-Id: <01428d8b1843232b882294c7494a3a45@gmail.com> Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed From: Peter Stewart Subject: Re: [Qemu-devel] cocoa.m using openGL Date: Mon, 23 May 2005 19:31:20 +0200 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Hi, It looks faster than the original, but I don't have a benchmark, is there one? I would really like a bootable image with Doom 1 on it. I also added to Makefile.target, the "-framework OpenGL" bit. ifdef CONFIG_COCOA VL_OBJS+=cocoa.o COCOA_LIBS=-F/System/Library/Frameworks -framework Cocoa -framework OpenGL endif enjoy, peter. Here is the diff for cocoa.m ( diff cocoa.m.orig cocoa.m ) (from 0.7.0 dl): > #include > #include > 42,43c45,46 < NSWindow *window = NULL; < NSQuickDrawView *qd_view = NULL; --- > static NSWindow *window = NULL; > static NSOpenGLView *ogl_view = NULL; 44a48 > #define SCREEN_BPP 32 49a54,56 > GLint screen_tex = 0; > GLuint display_list_tex = 0; > 64a72 > 72a81,95 > > // Make this context current > [[ogl_view openGLContext] makeCurrentContext]; > > // Bind, update and draw new image > glBindTexture(GL_TEXTURE_RECTANGLE_EXT, screen_tex); > > // glTexSubImage2D is faster when not using a texture range > glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, (GLint)ds->width, (GLint)ds->height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, ds->data); > > // Use the compiled display list > glCallList(display_list_tex); > > // Swap buffer to screen > [[ogl_view openGLContext] flushBuffer]; 74,88d96 < /* Use QDFlushPortBuffer() to flush content to display */ < RgnHandle dirty = NewRgn (); < RgnHandle temp = NewRgn (); < < SetEmptyRgn (dirty); < < /* Build the region of dirty rectangles */ < MacSetRectRgn (temp, x, y, < x + w, y + h); < MacUnionRgn (dirty, temp, dirty); < < /* Flush the dirty region */ < QDFlushPortBuffer ( [ qd_view qdPort ], dirty ); < DisposeRgn (dirty); < DisposeRgn (temp); 98,100c106 < const int device_bpp = 32; < static void *screen_pixels; < static int screen_pitch; --- > 101a108,109 > > // printf("resizing to %d %d\n", w, h); 103,161c111,139 < //printf("resizing to %d %d\n", w, h); < < contentRect = NSMakeRect (0, 0, w, h); < if(window) < { < [window close]; < [window release]; < } < window = [ [ QemuWindow alloc ] initWithContentRect:contentRect < styleMask: NSTitledWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask < backing:NSBackingStoreBuffered defer:NO]; < if(!window) < { < fprintf(stderr, "(cocoa) can't create window\n"); < exit(1); < } < < if(qd_view) < [qd_view release]; < < qd_view = [ [ NSQuickDrawView alloc ] initWithFrame:contentRect ]; < < if(!qd_view) < { < fprintf(stderr, "(cocoa) can't create qd_view\n"); < exit(1); < } < < [ window setAcceptsMouseMovedEvents:YES ]; < [ window setTitle:@"Qemu" ]; < [ window setReleasedWhenClosed:NO ]; < < /* Set screen to black */ < [ window setBackgroundColor: [NSColor blackColor] ]; < < /* set window position */ < [ window center ]; < < [ qd_view setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable ]; < [ [ window contentView ] addSubview:qd_view ]; < [ qd_view release ]; < [ window makeKeyAndOrderFront:nil ]; < < /* Careful here, the window seems to have to be onscreen to do that */ < LockPortBits ( [ qd_view qdPort ] ); < screen_pixels = GetPixBaseAddr ( GetPortPixMap ( [ qd_view qdPort ] ) ); < screen_pitch = GetPixRowBytes ( GetPortPixMap ( [ qd_view qdPort ] ) ); < UnlockPortBits ( [ qd_view qdPort ] ); < { < int vOffset = [ window frame ].size.height - < [ qd_view frame ].size.height - [ qd_view frame ].origin.y; < < int hOffset = [ qd_view frame ].origin.x; < < screen_pixels += (vOffset * screen_pitch) + hOffset * (device_bpp/8); < } < ds->data = screen_pixels; < ds->linesize = screen_pitch; < ds->depth = device_bpp; --- > contentRect = NSMakeRect (0, 0, w, h); > > [window setContentSize:contentRect.size]; > [window update]; > > [[ogl_view openGLContext] makeCurrentContext]; > [[ogl_view openGLContext] update]; > > glViewport(0, 0, (int) contentRect.size.width, (int) contentRect.size.height); > > glMatrixMode(GL_PROJECTION); > glLoadIdentity(); > > glMatrixMode(GL_MODELVIEW); > glLoadIdentity(); > > // This is used as a init'd flag as well... > if(screen_tex != 0) { > glDeleteTextures(1, &screen_tex); > glDeleteLists(display_list_tex, 1); > } > > screen_tex = 1; > > if(ds->data != NULL) free(ds->data); > ds->data = (GLubyte *) malloc(w * h * (SCREEN_BPP >> 3)); > assert(ds->data != NULL); > ds->linesize = w * (SCREEN_BPP >> 3); > ds->depth = SCREEN_BPP; 164,165c142,195 < < current_ds = *ds; --- > > // Setup some basic OpenGL stuff as from Apple > glPixelStorei(GL_UNPACK_ALIGNMENT, 1); > glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); > glClearColor(1.0f, 1.0f, 1.0f, 1.0f); > glColor4f(1.0f, 1.0f, 1.0f, 1.0f); > > glEnable(GL_TEXTURE_RECTANGLE_EXT); > glBindTexture(GL_TEXTURE_RECTANGLE_EXT, screen_tex); > > glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, w * h * (SCREEN_BPP >> 3), ds->data); > > // Use CACHED for VRAM+reused tex Use SHARED for AGP+used once tex > // Note the texture is always changing so use SHARED > glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , GL_STORAGE_SHARED_APPLE); > glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); > glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST); > glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST); > glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); > glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); > glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); > > glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, ds->data); > > glFlush(); > > // Setup a display list to save all the operations below > > display_list_tex = glGenLists(1); > glNewList(display_list_tex, GL_COMPILE); > > glBegin(GL_QUADS); > > glTexCoord2f(0.0f, 0.0f); > glVertex2f(-1.0f, 1.0f); > > glTexCoord2f(0.0f, (GLfloat)h); > glVertex2f(-1.0f, -1.0f); > > glTexCoord2f((GLfloat)w, (GLfloat)h); > glVertex2f(1.0f, -1.0f); > > glTexCoord2f((GLfloat)w, 0.0f); > glVertex2f(1.0f, 1.0f); > > glEnd(); > > glEndList(); > > > // Swap buffer to screen > [[ogl_view openGLContext] flushBuffer]; > > memcpy(¤t_ds, ds, sizeof(DisplayState)); 246d275 < NSDate *distantPast; 248d276 < NSAutoreleasePool *pool; 250,253c278,279 < < pool = [ [ NSAutoreleasePool alloc ] init ]; < distantPast = [ NSDate distantPast ]; < --- > NSDate *distantPast = [ NSDate distantPast ];; > 255a282 > 257,258c284,285 < event = [ NSApp nextEventMatchingMask:NSAnyEventMask untilDate:distantPast < inMode: NSDefaultRunLoopMode dequeue:YES ]; --- > event = [ window nextEventMatchingMask:NSAnyEventMask untilDate:distantPast inMode: NSDefaultRunLoopMode dequeue:YES ]; > 280a308,309 > > 282,291c311,319 < < case NSLeftMouseDown: < case NSLeftMouseUp: < < case NSOtherMouseDown: < case NSRightMouseDown: < < case NSOtherMouseUp: < case NSRightMouseUp: < --- > if(grab) > { > int dz = [event deltaZ]; > > kbd_mouse_event(0, 0, dz, 0); > } > break; > > 292a321,332 > if(grab) > { > int dx = [event deltaX]; > int dy = [event deltaY]; > > kbd_mouse_event(dx, dy, 0, 0); > } > break; > > > case NSOtherMouseDown: > case NSOtherMouseUp: 293a334,345 > if(grab) > { > int dx = [event deltaX]; > int dy = [event deltaY]; > int dz = [event deltaZ]; > > kbd_mouse_event(dx, dy, dz, MOUSE_EVENT_MBUTTON); > } > break; > > case NSRightMouseDown: > case NSRightMouseUp: 294a347,358 > if(grab) > { > int dx = [event deltaX]; > int dy = [event deltaY]; > int dz = [event deltaZ]; > > kbd_mouse_event(dx, dy, dz, MOUSE_EVENT_RBUTTON); > } > break; > > case NSLeftMouseDown: > case NSLeftMouseUp: 296,297c360,371 < < default: [NSApp sendEvent:event]; --- > if(grab) > { > int dx = [event deltaX]; > int dy = [event deltaY]; > int dz = [event deltaZ]; > > kbd_mouse_event(dx, dy, dz, MOUSE_EVENT_LBUTTON); > } > break; > > default: > [NSApp sendEvent:event]; 300a375 > 322,324c397,455 < ds->dpy_update = cocoa_update; < ds->dpy_resize = cocoa_resize; < ds->dpy_refresh = cocoa_refresh; --- > //printf("resizing to %d %d\n", w, h); > > const int w = 640; > const int h = 400; > > if(window == nil) > { > // Init pixel format attribs > NSOpenGLPixelFormatAttribute attrs[] = > { > NSOpenGLPFAAccelerated, > NSOpenGLPFANoRecovery, > NSOpenGLPFADoubleBuffer, > 0 > }; > > NSRect contentRect = NSMakeRect (0, 0, w, h); > > // Get pixel format from OpenGL > NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; > if (!pixFmt) > { > fprintf(stderr, "No pixel format -- exiting"); > exit(1); > } > > window = [ [ QemuWindow alloc ] initWithContentRect:contentRect > styleMask: NSTitledWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask > backing:NSBackingStoreBuffered defer:NO]; > if(!window) > { > fprintf(stderr, "(cocoa) can't create window\n"); > exit(1); > } > > ogl_view = [ [ NSOpenGLView alloc ] initWithFrame:contentRect pixelFormat:pixFmt ]; > > if(!ogl_view) > { > fprintf(stderr, "(cocoa) can't create ogl_view\n"); > exit(1); > } > > [ window setAcceptsMouseMovedEvents:YES ]; > [ window setTitle:@"Qemu" ]; > [ window setReleasedWhenClosed:NO ]; > > /* set window position */ > [ window center ]; > [ window makeKeyAndOrderFront:nil ]; > > [ ogl_view setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable ]; > [ window setContentView:ogl_view ]; > [ ogl_view release ]; > } > > ds->dpy_update = cocoa_update; > ds->dpy_resize = cocoa_resize; > ds->dpy_refresh = cocoa_refresh; 327c458,462 < --- > > [ window display ]; > [ window makeMainWindow ]; > [ window makeKeyWindow ]; > 344,359c479 < static void QZ_SetPortAlphaOpaque () < { < /* Assume 32 bit if( bpp == 32 )*/ < if ( 1 ) { < < uint32_t *pixels = (uint32_t*) current_ds.data; < uint32_t rowPixels = current_ds.linesize / 4; < uint32_t i, j; < < for (i = 0; i < current_ds.height; i++) < for (j = 0; j < current_ds.width; j++) { < < pixels[ (i * rowPixels) + j ] |= 0xFF000000; < } < } < } --- > 365,367c485 < /* make the alpha channel opaque so anim won't have holes in it */ < QZ_SetPortAlphaOpaque (); < --- > /* make the alpha channel opaque so anim won't have holes in it */ 380,382c498 < < /* make sure pixels are fully opaque */ < QZ_SetPortAlphaOpaque (); --- > 385c501 < [ self cacheImageInRect:[ qd_view frame ] ]; --- > [ self cacheImageInRect:[ ogl_view frame ] ]; 427,428c543,544 < cocoa_resize(¤t_ds, 640, 400); < --- > cocoa_display_init(¤t_ds, 0); > 451a568,572 > > > > > 454c575,577 < if(returnCode == NSCancelButton) --- > [sheet close]; > > if(returnCode == NSCancelButton)