📄 intel_screen.c
字号:
} /* Allocate the private area */ intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate)); if (!intelScreen) { fprintf(stderr, "\nERROR! Allocating private area failed\n"); return GL_FALSE; } /* parse information in __driConfigOptions */ driParseOptionInfo(&intelScreen->optionCache, __driConfigOptions, __driNConfigOptions); intelScreen->driScrnPriv = sPriv; sPriv->private = (void *) intelScreen; intelScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset; sarea = (struct drm_i915_sarea *) (((GLubyte *) sPriv->pSAREA) + intelScreen->sarea_priv_offset); intelScreen->deviceID = gDRIPriv->deviceID; intelUpdateScreenFromSAREA(intelScreen, sarea); if (!intelMapScreenRegions(sPriv)) { fprintf(stderr, "\nERROR! mapping regions\n"); _mesa_free(intelScreen); sPriv->private = NULL; return GL_FALSE; } intelScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset; if (0) intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv); intelScreen->drmMinor = sPriv->drm_version.minor; /* Determine if IRQs are active? */ if (!intel_get_param(sPriv, I915_PARAM_IRQ_ACTIVE, &intelScreen->irq_active)) return GL_FALSE; /* Determine if batchbuffers are allowed */ if (!intel_get_param(sPriv, I915_PARAM_ALLOW_BATCHBUFFER, &intelScreen->allow_batchbuffer)) return GL_FALSE; sPriv->extensions = intelScreenExtensions; return GL_TRUE;}static voidintelDestroyScreen(__DRIscreenPrivate * sPriv){ intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; intelUnmapScreenRegions(intelScreen); FREE(intelScreen); sPriv->private = NULL;}/** * This is called when we need to set up GL rendering to a new X window. */static GLbooleanintelCreateBuffer(__DRIscreenPrivate * driScrnPriv, __DRIdrawablePrivate * driDrawPriv, const __GLcontextModes * mesaVis, GLboolean isPixmap){ intelScreenPrivate *screen = (intelScreenPrivate *) driScrnPriv->private; if (isPixmap) { return GL_FALSE; /* not implemented */ } else { GLboolean swStencil = (mesaVis->stencilBits > 0 && mesaVis->depthBits != 24); GLenum rgbFormat = (mesaVis->redBits == 5 ? GL_RGB5 : GL_RGBA8); struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer); if (!intel_fb) return GL_FALSE; _mesa_initialize_framebuffer(&intel_fb->Base, mesaVis); /* setup the hardware-based renderbuffers */ { intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat); _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT, &intel_fb->color_rb[0]->Base); } if (mesaVis->doubleBufferMode) { intel_fb->color_rb[1] = intel_create_renderbuffer(rgbFormat); _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT, &intel_fb->color_rb[1]->Base); if (screen->third.handle) { struct gl_renderbuffer *tmp_rb = NULL; intel_fb->color_rb[2] = intel_create_renderbuffer(rgbFormat); _mesa_reference_renderbuffer(&tmp_rb, &intel_fb->color_rb[2]->Base); } } if (mesaVis->depthBits == 24) { if (mesaVis->stencilBits == 8) { /* combined depth/stencil buffer */ struct intel_renderbuffer *depthStencilRb = intel_create_renderbuffer(GL_DEPTH24_STENCIL8_EXT); /* note: bind RB to two attachment points */ _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthStencilRb->Base); _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL, &depthStencilRb->Base); } else { struct intel_renderbuffer *depthRb = intel_create_renderbuffer(GL_DEPTH_COMPONENT24); _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base); } } else if (mesaVis->depthBits == 16) { /* just 16-bit depth buffer, no hw stencil */ struct intel_renderbuffer *depthRb = intel_create_renderbuffer(GL_DEPTH_COMPONENT16); _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base); } /* now add any/all software-based renderbuffers we may need */ _mesa_add_soft_renderbuffers(&intel_fb->Base, GL_FALSE, /* never sw color */ GL_FALSE, /* never sw depth */ swStencil, mesaVis->accumRedBits > 0, GL_FALSE, /* never sw alpha */ GL_FALSE /* never sw aux */ ); driDrawPriv->driverPrivate = (void *) intel_fb; return GL_TRUE; }}static voidintelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv){ _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));}/** * Get information about previous buffer swaps. */static intintelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo){ struct intel_framebuffer *intel_fb; if ((dPriv == NULL) || (dPriv->driverPrivate == NULL) || (sInfo == NULL)) { return -1; } intel_fb = dPriv->driverPrivate; sInfo->swap_count = intel_fb->swap_count; sInfo->swap_ust = intel_fb->swap_ust; sInfo->swap_missed_count = intel_fb->swap_missed_count; sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0) ? driCalculateSwapUsage(dPriv, 0, intel_fb->swap_missed_ust) : 0.0; return 0;}/* There are probably better ways to do this, such as an * init-designated function to register chipids and createcontext * functions. */extern GLboolean i830CreateContext(const __GLcontextModes * mesaVis, __DRIcontextPrivate * driContextPriv, void *sharedContextPrivate);extern GLboolean i915CreateContext(const __GLcontextModes * mesaVis, __DRIcontextPrivate * driContextPriv, void *sharedContextPrivate);extern GLboolean brwCreateContext(const __GLcontextModes * mesaVis, __DRIcontextPrivate * driContextPriv, void *sharedContextPrivate);static GLbooleanintelCreateContext(const __GLcontextModes * mesaVis, __DRIcontextPrivate * driContextPriv, void *sharedContextPrivate){ __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;#ifdef I915 if (IS_9XX(intelScreen->deviceID)) { if (!IS_965(intelScreen->deviceID)) { return i915CreateContext(mesaVis, driContextPriv, sharedContextPrivate); } } else { return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate); }#else if (IS_965(intelScreen->deviceID)) return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);#endif fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID); return GL_FALSE;}static __DRIconfig **intelFillInModes(__DRIscreenPrivate *psp, unsigned pixel_bits, unsigned depth_bits, unsigned stencil_bits, GLboolean have_back_buffer){ __DRIconfig **configs; __GLcontextModes *m; unsigned depth_buffer_factor; unsigned back_buffer_factor; GLenum fb_format; GLenum fb_type; int i; /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't * support pageflipping at all. */ static const GLenum back_buffer_modes[] = { GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML }; u_int8_t depth_bits_array[3]; u_int8_t stencil_bits_array[3]; depth_bits_array[0] = 0; depth_bits_array[1] = depth_bits; depth_bits_array[2] = depth_bits; /* Just like with the accumulation buffer, always provide some modes * with a stencil buffer. It will be a sw fallback, but some apps won't * care about that. */ stencil_bits_array[0] = 0; stencil_bits_array[1] = 0; if (depth_bits == 24) stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits; stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits; depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1; back_buffer_factor = (have_back_buffer) ? 3 : 1; if (pixel_bits == 16) { fb_format = GL_RGB; fb_type = GL_UNSIGNED_SHORT_5_6_5; } else { fb_format = GL_BGRA; fb_type = GL_UNSIGNED_INT_8_8_8_8_REV; } configs = driCreateConfigs(fb_format, fb_type, depth_bits_array, stencil_bits_array, depth_buffer_factor, back_buffer_modes, back_buffer_factor); if (configs == NULL) { fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, __LINE__); return NULL; } /* Mark the visual as slow if there are "fake" stencil bits. */ for (i = 0; configs[i]; i++) { m = &configs[i]->modes; if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) { m->visualRating = GLX_SLOW_CONFIG; } } return configs;}/** * This is the driver specific part of the createNewScreen entry point. * Called when using legacy DRI. * * \todo maybe fold this into intelInitDriver * * \return the __GLcontextModes supported by this driver */static const __DRIconfig **intelInitScreen(__DRIscreenPrivate *psp){#ifdef I915 static const __DRIversion ddx_expected = { 1, 5, 0 };#else static const __DRIversion ddx_expected = { 1, 6, 0 };#endif static const __DRIversion dri_expected = { 4, 0, 0 }; static const __DRIversion drm_expected = { 1, 5, 0 }; I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv; if (!driCheckDriDdxDrmVersions2("i915", &psp->dri_version, &dri_expected, &psp->ddx_version, &ddx_expected, &psp->drm_version, &drm_expected)) { return NULL; } /* Calling driInitExtensions here, with a NULL context pointer, * does not actually enable the extensions. It just makes sure * that all the dispatch offsets for all the extensions that * *might* be enables are known. This is needed because the * dispatch offsets need to be known when _mesa_context_create is * called, but we can't enable the extensions until we have a * context pointer. * * Hello chicken. Hello egg. How are you two today? */ intelInitExtensions(NULL, GL_TRUE); if (!intelInitDriver(psp)) return NULL; psp->extensions = intelScreenExtensions; return (const __DRIconfig **) intelFillInModes(psp, dri_priv->cpp * 8, (dri_priv->cpp == 2) ? 16 : 24, (dri_priv->cpp == 2) ? 0 : 8, 1);}struct intel_context *intelScreenContext(intelScreenPrivate *intelScreen){ /* * This should probably change to have the screen allocate a dummy * context at screen creation. For now just use the current context. */ GET_CURRENT_CONTEXT(ctx); if (ctx == NULL) { _mesa_problem(NULL, "No current context in intelScreenContext\n"); return NULL; } return intel_context(ctx);}/** * This is the driver specific part of the createNewScreen entry point. * Called when using DRI2. * * \return the __GLcontextModes supported by this driver */static const__DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp){ intelScreenPrivate *intelScreen; /* Calling driInitExtensions here, with a NULL context pointer, * does not actually enable the extensions. It just makes sure * that all the dispatch offsets for all the extensions that * *might* be enables are known. This is needed because the * dispatch offsets need to be known when _mesa_context_create is * called, but we can't enable the extensions until we have a * context pointer. * * Hello chicken. Hello egg. How are you two today? */ intelInitExtensions(NULL, GL_TRUE); /* Allocate the private area */ intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate)); if (!intelScreen) { fprintf(stderr, "\nERROR! Allocating private area failed\n"); return GL_FALSE; } /* parse information in __driConfigOptions */ driParseOptionInfo(&intelScreen->optionCache, __driConfigOptions, __driNConfigOptions); intelScreen->driScrnPriv = psp; psp->private = (void *) intelScreen; intelScreen->drmMinor = psp->drm_version.minor; /* Determine chipset ID? */ if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID, &intelScreen->deviceID)) return GL_FALSE; /* Determine if IRQs are active? */ if (!intel_get_param(psp, I915_PARAM_IRQ_ACTIVE, &intelScreen->irq_active)) return GL_FALSE; /* Determine if batchbuffers are allowed */ if (!intel_get_param(psp, I915_PARAM_ALLOW_BATCHBUFFER, &intelScreen->allow_batchbuffer)) return GL_FALSE; if (!intelScreen->allow_batchbuffer) { fprintf(stderr, "batch buffer not allowed\n"); return GL_FALSE; } psp->extensions = intelScreenExtensions; return driConcatConfigs(intelFillInModes(psp, 16, 16, 0, 1), intelFillInModes(psp, 32, 24, 8, 1));}const struct __DriverAPIRec driDriverAPI = { .InitScreen = intelInitScreen, .DestroyScreen = intelDestroyScreen, .CreateContext = intelCreateContext, .DestroyContext = intelDestroyContext, .CreateBuffer = intelCreateBuffer, .DestroyBuffer = intelDestroyBuffer, .SwapBuffers = intelSwapBuffers, .MakeCurrent = intelMakeCurrent, .UnbindContext = intelUnbindContext, .GetSwapInfo = intelGetSwapInfo, .GetDrawableMSC = driDrawableGetMSC32, .WaitForMSC = driWaitForMSC32, .CopySubBuffer = intelCopySubBuffer, .InitScreen2 = intelInitScreen2, .HandleDrawableConfig = intelHandleDrawableConfig, .HandleBufferAttach = intelHandleBufferAttach,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -