diff options
| l---------[-rw-r--r--] | src/mesa/drivers/dri/i915/intel_context.c | 863 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_metaops.c | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_misc_state.c | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/intel_context.c | 3 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/intel_context.h | 453 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/intel_pixel_copy.c | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_context.c | 862 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_context.h (renamed from src/mesa/drivers/dri/i915/intel_context.h) | 90 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_pixel.h | 6 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_pixel_bitmap.c | 2 | 
10 files changed, 944 insertions, 1340 deletions
diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c index 1c340f7940..27a1cbb255 100644..120000 --- a/src/mesa/drivers/dri/i915/intel_context.c +++ b/src/mesa/drivers/dri/i915/intel_context.c @@ -1,862 +1 @@ -/************************************************************************** - *  - * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *  - **************************************************************************/ - - -#include "glheader.h" -#include "context.h" -#include "matrix.h" -#include "simple_list.h" -#include "extensions.h" -#include "framebuffer.h" -#include "imports.h" -#include "points.h" - -#include "swrast/swrast.h" -#include "swrast_setup/swrast_setup.h" -#include "tnl/tnl.h" - -#include "tnl/t_pipeline.h" -#include "tnl/t_vertex.h" - -#include "drivers/common/driverfuncs.h" - -#include "intel_screen.h" - -#include "i830_dri.h" - -#include "intel_chipset.h" -#include "intel_buffers.h" -#include "intel_tex.h" -#include "intel_span.h" -#include "intel_tris.h" -#include "intel_ioctl.h" -#include "intel_batchbuffer.h" -#include "intel_blit.h" -#include "intel_pixel.h" -#include "intel_regions.h" -#include "intel_buffer_objects.h" -#include "intel_fbo.h" -#include "intel_decode.h" -#include "intel_bufmgr_ttm.h" - -#include "drirenderbuffer.h" -#include "vblank.h" -#include "utils.h" -#include "xmlpool.h"            /* for symbolic values of enum-type options */ -#ifndef INTEL_DEBUG -int INTEL_DEBUG = (0); -#endif - -#define need_GL_ARB_multisample -#define need_GL_ARB_point_parameters -#define need_GL_ARB_texture_compression -#define need_GL_ARB_vertex_buffer_object -#define need_GL_ARB_vertex_program -#define need_GL_ARB_window_pos -#define need_GL_EXT_blend_color -#define need_GL_EXT_blend_equation_separate -#define need_GL_EXT_blend_func_separate -#define need_GL_EXT_blend_minmax -#define need_GL_EXT_cull_vertex -#define need_GL_EXT_fog_coord -#define need_GL_EXT_framebuffer_object -#define need_GL_EXT_multi_draw_arrays -#define need_GL_EXT_secondary_color -#define need_GL_NV_vertex_program -#include "extension_helper.h" - - -#define DRIVER_DATE                     "20061102" - -_glthread_Mutex lockMutex; -static GLboolean lockMutexInit = GL_FALSE; - - -static const GLubyte * -intelGetString(GLcontext * ctx, GLenum name) -{ -   const char *chipset; -   static char buffer[128]; - -   switch (name) { -   case GL_VENDOR: -      return (GLubyte *) "Tungsten Graphics, Inc"; -      break; - -   case GL_RENDERER: -      switch (intel_context(ctx)->intelScreen->deviceID) { -      case PCI_CHIP_845_G: -         chipset = "Intel(R) 845G"; -         break; -      case PCI_CHIP_I830_M: -         chipset = "Intel(R) 830M"; -         break; -      case PCI_CHIP_I855_GM: -         chipset = "Intel(R) 852GM/855GM"; -         break; -      case PCI_CHIP_I865_G: -         chipset = "Intel(R) 865G"; -         break; -      case PCI_CHIP_I915_G: -         chipset = "Intel(R) 915G"; -         break; -      case PCI_CHIP_E7221_G: -	 chipset = "Intel (R) E7221G (i915)"; -	 break; -      case PCI_CHIP_I915_GM: -         chipset = "Intel(R) 915GM"; -         break; -      case PCI_CHIP_I945_G: -         chipset = "Intel(R) 945G"; -         break; -      case PCI_CHIP_I945_GM: -         chipset = "Intel(R) 945GM"; -         break; -      case PCI_CHIP_I945_GME: -         chipset = "Intel(R) 945GME"; -         break; -      case PCI_CHIP_G33_G: -	 chipset = "Intel(R) G33"; -	 break; -      case PCI_CHIP_Q35_G: -	 chipset = "Intel(R) Q35"; -	 break; -      case PCI_CHIP_Q33_G: -	 chipset = "Intel(R) Q33"; -	 break; -      default: -         chipset = "Unknown Intel Chipset"; -         break; -      } - -      (void) driGetRendererString(buffer, chipset, DRIVER_DATE, 0); -      return (GLubyte *) buffer; - -   default: -      return NULL; -   } -} - - -/** - * Extension strings exported by the intel driver. - */ -const struct dri_extension card_extensions[] = { -   {"GL_ARB_multisample", GL_ARB_multisample_functions}, -   {"GL_ARB_multitexture", NULL}, -   {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions}, -   {"GL_ARB_texture_border_clamp", NULL}, -   {"GL_ARB_texture_compression", GL_ARB_texture_compression_functions}, -   {"GL_ARB_texture_cube_map", NULL}, -   {"GL_ARB_texture_env_add", NULL}, -   {"GL_ARB_texture_env_combine", NULL}, -   {"GL_ARB_texture_env_dot3", NULL}, -   {"GL_ARB_texture_mirrored_repeat", NULL}, -   {"GL_ARB_texture_rectangle", NULL}, -   {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions}, -   {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions}, -   {"GL_ARB_window_pos", GL_ARB_window_pos_functions}, -   {"GL_EXT_blend_color", GL_EXT_blend_color_functions}, -   {"GL_EXT_blend_equation_separate", -    GL_EXT_blend_equation_separate_functions}, -   {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions}, -   {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions}, -   {"GL_EXT_blend_subtract", NULL}, -   {"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions}, -   {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions}, -   {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions}, -#if 1                           /* XXX FBO temporary? */ -   {"GL_EXT_packed_depth_stencil", NULL}, -#endif -   {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions}, -   {"GL_EXT_stencil_wrap", NULL}, -   {"GL_EXT_texture_edge_clamp", NULL}, -   {"GL_EXT_texture_env_combine", NULL}, -   {"GL_EXT_texture_env_dot3", NULL}, -   {"GL_EXT_texture_filter_anisotropic", NULL}, -   {"GL_EXT_texture_lod_bias", NULL}, -   {"GL_3DFX_texture_compression_FXT1", NULL}, -   {"GL_APPLE_client_storage", NULL}, -   {"GL_MESA_pack_invert", NULL}, -   {"GL_MESA_ycbcr_texture", NULL}, -   {"GL_NV_blend_square", NULL}, -   {"GL_NV_vertex_program", GL_NV_vertex_program_functions}, -   {"GL_NV_vertex_program1_1", NULL}, -   { "GL_SGIS_generate_mipmap", NULL }, -   {NULL, NULL} -}; - -const struct dri_extension ttm_extensions[] = { -   {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions}, -   {"GL_ARB_pixel_buffer_object", NULL}, -   {NULL, NULL} -}; - -extern const struct tnl_pipeline_stage _intel_render_stage; - -static const struct tnl_pipeline_stage *intel_pipeline[] = { -   &_tnl_vertex_transform_stage, -   &_tnl_vertex_cull_stage, -   &_tnl_normal_transform_stage, -   &_tnl_lighting_stage, -   &_tnl_fog_coordinate_stage, -   &_tnl_texgen_stage, -   &_tnl_texture_transform_stage, -   &_tnl_point_attenuation_stage, -   &_tnl_vertex_program_stage, -#if 1 -   &_intel_render_stage,        /* ADD: unclipped rastersetup-to-dma */ -#endif -   &_tnl_render_stage, -   0, -}; - - -static const struct dri_debug_control debug_control[] = { -   {"tex", DEBUG_TEXTURE}, -   {"state", DEBUG_STATE}, -   {"ioctl", DEBUG_IOCTL}, -   {"blit", DEBUG_BLIT}, -   {"mip", DEBUG_MIPTREE}, -   {"fall", DEBUG_FALLBACKS}, -   {"verb", DEBUG_VERBOSE}, -   {"bat", DEBUG_BATCH}, -   {"pix", DEBUG_PIXEL}, -   {"buf", DEBUG_BUFMGR}, -   {"reg", DEBUG_REGION}, -   {"fbo", DEBUG_FBO}, -   {"lock", DEBUG_LOCK}, -   {"sync", DEBUG_SYNC}, -   {NULL, 0} -}; - - -static void -intelInvalidateState(GLcontext * ctx, GLuint new_state) -{ -   _swrast_InvalidateState(ctx, new_state); -   _swsetup_InvalidateState(ctx, new_state); -   _vbo_InvalidateState(ctx, new_state); -   _tnl_InvalidateState(ctx, new_state); -   _tnl_invalidate_vertex_state(ctx, new_state); -   intel_context(ctx)->NewGLState |= new_state; -} - - -void -intelFlush(GLcontext * ctx) -{ -   struct intel_context *intel = intel_context(ctx); - -   if (intel->Fallback) -      _swrast_flush(ctx); - -   INTEL_FIREVERTICES(intel); - -   if (intel->batch->map != intel->batch->ptr) -      intel_batchbuffer_flush(intel->batch); - -   /* XXX: Need to do an MI_FLUSH here. -    */ -} - -void -intelFinish(GLcontext * ctx) -{ -   struct intel_context *intel = intel_context(ctx); -   intelFlush(ctx); -   if (intel->batch->last_fence) { -      dri_fence_wait(intel->batch->last_fence); -      dri_fence_unreference(intel->batch->last_fence); -      intel->batch->last_fence = NULL; -   } -} - -/** Driver-specific fence emit implementation for the fake memory manager. */ -static unsigned int -intel_fence_emit(void *private) -{ -   struct intel_context *intel = (struct intel_context *)private; -   unsigned int fence; - -   /* XXX: Need to emit a flush, if we haven't already (at least with the -    * current batchbuffer implementation, we have). -    */ - -   fence = intelEmitIrqLocked(intel); - -   return fence; -} - -/** Driver-specific fence wait implementation for the fake memory manager. */ -static int -intel_fence_wait(void *private, unsigned int cookie) -{ -   struct intel_context *intel = (struct intel_context *)private; - -   intelWaitIrq(intel, cookie); - -   return 0; -} - -static GLboolean -intel_init_bufmgr(struct intel_context *intel) -{ -   intelScreenPrivate *intelScreen = intel->intelScreen; -   GLboolean ttm_disable = getenv("INTEL_NO_TTM") != NULL; - -   /* If we've got a new enough DDX that's initializing TTM and giving us -    * object handles for the shared buffers, use that. -    */ -   intel->ttm = GL_FALSE; -   if (!ttm_disable && -       intel->intelScreen->driScrnPriv->ddx_version.minor >= 9 && -       intel->intelScreen->drmMinor >= 11 && -       intel->intelScreen->front.bo_handle != -1) -   { -      intel->bufmgr = intel_bufmgr_ttm_init(intel->driFd, -					    DRM_FENCE_TYPE_EXE, -					    DRM_FENCE_TYPE_EXE | -					    DRM_I915_FENCE_TYPE_RW, -					    BATCH_SZ); -      if (intel->bufmgr != NULL) -	 intel->ttm = GL_TRUE; -   } -   /* Otherwise, use the classic buffer manager. */ -   if (intel->bufmgr == NULL) { -      if (ttm_disable) { -	 fprintf(stderr, "TTM buffer manager disabled.  Using classic.\n"); -      } else { -	 fprintf(stderr, "Failed to initialize TTM buffer manager.  " -		 "Falling back to classic.\n"); -      } - -      if (intelScreen->tex.size == 0) { -	 fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", -		 __func__, __LINE__); -	 return GL_FALSE; -      } - -      intel->bufmgr = dri_bufmgr_fake_init(intelScreen->tex.offset, -					   intelScreen->tex.map, -					   intelScreen->tex.size, -					   intel_fence_emit, -					   intel_fence_wait, -					   intel); -   } - -   return GL_TRUE; -} - -void -intelInitDriverFunctions(struct dd_function_table *functions) -{ -   _mesa_init_driver_functions(functions); - -   functions->Flush = intelFlush; -   functions->Finish = intelFinish; -   functions->GetString = intelGetString; -   functions->UpdateState = intelInvalidateState; -   functions->CopyColorTable = _swrast_CopyColorTable; -   functions->CopyColorSubTable = _swrast_CopyColorSubTable; -   functions->CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; -   functions->CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; - -   intelInitTextureFuncs(functions); -   intelInitPixelFuncs(functions); -   intelInitStateFuncs(functions); -   intelInitBufferFuncs(functions); -} - - -GLboolean -intelInitContext(struct intel_context *intel, -                 const __GLcontextModes * mesaVis, -                 __DRIcontextPrivate * driContextPriv, -                 void *sharedContextPrivate, -                 struct dd_function_table *functions) -{ -   GLcontext *ctx = &intel->ctx; -   GLcontext *shareCtx = (GLcontext *) sharedContextPrivate; -   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; -   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; -   struct drm_i915_sarea *saPriv = (struct drm_i915_sarea *) -      (((GLubyte *) sPriv->pSAREA) + intelScreen->sarea_priv_offset); -   int fthrottle_mode; - -   if (!_mesa_initialize_context(&intel->ctx, -                                 mesaVis, shareCtx, -                                 functions, (void *) intel)) -      return GL_FALSE; - -   driContextPriv->driverPrivate = intel; -   intel->intelScreen = intelScreen; -   intel->driScreen = sPriv; -   intel->sarea = saPriv; - -   /* Dri stuff */ -   intel->hHWContext = driContextPriv->hHWContext; -   intel->driFd = sPriv->fd; -   intel->driHwLock = sPriv->lock; - -   intel->width = intelScreen->width; -   intel->height = intelScreen->height; - -   if (intelScreen->deviceID == PCI_CHIP_I865_G) -      intel->maxBatchSize = 4096; -   else -      intel->maxBatchSize = BATCH_SZ; - -   if (!intel_init_bufmgr(intel)) -      return GL_FALSE; - -   if (!lockMutexInit) { -      lockMutexInit = GL_TRUE; -      _glthread_INIT_MUTEX(lockMutex); -   } - -   driParseConfigFiles(&intel->optionCache, &intelScreen->optionCache, -                       intel->driScreen->myNum, "i915"); - -   ctx->Const.MaxTextureMaxAnisotropy = 2.0; - -   /* This doesn't yet catch all non-conformant rendering, but it's a -    * start. -    */ -   if (getenv("INTEL_STRICT_CONFORMANCE")) { -      intel->strict_conformance = 1; -   } - -   ctx->Const.MinLineWidth = 1.0; -   ctx->Const.MinLineWidthAA = 1.0; -   ctx->Const.MaxLineWidth = 3.0; -   ctx->Const.MaxLineWidthAA = 3.0; -   ctx->Const.LineWidthGranularity = 1.0; - -   ctx->Const.MinPointSize = 1.0; -   ctx->Const.MinPointSizeAA = 1.0; -   ctx->Const.MaxPointSize = 255.0; -   ctx->Const.MaxPointSizeAA = 3.0; -   ctx->Const.PointSizeGranularity = 1.0; - -   /* reinitialize the context point state. -    * It depend on constants in __GLcontextRec::Const -    */ -   _mesa_init_point(ctx); - -   ctx->Const.MaxColorAttachments = 4;  /* XXX FBO: review this */ - -   /* Initialize the software rasterizer and helper modules. */ -   _swrast_CreateContext(ctx); -   _vbo_CreateContext(ctx); -   _tnl_CreateContext(ctx); -   _swsetup_CreateContext(ctx); - -   /* Install the customized pipeline: */ -   _tnl_destroy_pipeline(ctx); -   _tnl_install_pipeline(ctx, intel_pipeline); - -   /* Configure swrast to match hardware characteristics: */ -   _swrast_allow_pixel_fog(ctx, GL_FALSE); -   _swrast_allow_vertex_fog(ctx, GL_TRUE); - -   intel->hw_stipple = 1; - -   /* XXX FBO: this doesn't seem to be used anywhere */ -   switch (mesaVis->depthBits) { -   case 0:                     /* what to do in this case? */ -   case 16: -      intel->polygon_offset_scale = 1.0; -      break; -   case 24: -      intel->polygon_offset_scale = 2.0;     /* req'd to pass glean */ -      break; -   default: -      assert(0); -      break; -   } - -   /* Initialize swrast, tnl driver tables: */ -   intelInitSpanFuncs(ctx); -   intelInitTriFuncs(ctx); - - -   intel->RenderIndex = ~0; - -   fthrottle_mode = driQueryOptioni(&intel->optionCache, "fthrottle_mode"); -   intel->irqsEmitted = 0; - -   intel->do_irqs = (intel->intelScreen->irq_active && -                     fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS); - -   intel->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS); - -   _math_matrix_ctr(&intel->ViewportMatrix); - -   /* Disable imaging extension until convolution is working in -    * teximage paths: -    */ -   driInitExtensions(ctx, card_extensions, -/* 		      GL_TRUE, */ -                     GL_FALSE); - -   if (intel->ttm) -      driInitExtensions(ctx, ttm_extensions, GL_FALSE); - -   if (!sPriv->dri2.enabled) -      intel_recreate_static_regions(intel); - -   intel->batch = intel_batchbuffer_alloc(intel); -   intel->last_swap_fence = NULL; -   intel->first_swap_fence = NULL; - -   intel_bufferobj_init(intel); -   intel_fbo_init(intel); - -   if (intel->ctx.Mesa_DXTn) { -      _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); -      _mesa_enable_extension(ctx, "GL_S3_s3tc"); -   } -   else if (driQueryOptionb(&intel->optionCache, "force_s3tc_enable")) { -      _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); -   } - -   intel->prim.primitive = ~0; - -#if DO_DEBUG -   INTEL_DEBUG = driParseDebugString(getenv("INTEL_DEBUG"), debug_control); -   if (INTEL_DEBUG & DEBUG_BUFMGR) -      dri_bufmgr_set_debug(intel->bufmgr, GL_TRUE); -#endif - -   if (driQueryOptionb(&intel->optionCache, "no_rast")) { -      fprintf(stderr, "disabling 3D rasterization\n"); -      FALLBACK(intel, INTEL_FALLBACK_USER, 1); -   } - -   /* Disable all hardware rendering (skip emitting batches and fences/waits -    * to the kernel) -    */ -   intel->no_hw = getenv("INTEL_NO_HW") != NULL; - -   return GL_TRUE; -} - -void -intelDestroyContext(__DRIcontextPrivate * driContextPriv) -{ -   struct intel_context *intel = -      (struct intel_context *) driContextPriv->driverPrivate; - -   assert(intel);               /* should never be null */ -   if (intel) { -      GLboolean release_texture_heaps; - -      INTEL_FIREVERTICES(intel); - -      intel->vtbl.destroy(intel); - -      release_texture_heaps = (intel->ctx.Shared->RefCount == 1); -      _swsetup_DestroyContext(&intel->ctx); -      _tnl_DestroyContext(&intel->ctx); -      _vbo_DestroyContext(&intel->ctx); - -      _swrast_DestroyContext(&intel->ctx); -      intel->Fallback = 0;      /* don't call _swrast_Flush later */ - -      intel_batchbuffer_free(intel->batch); - -      if (intel->last_swap_fence) { -	 dri_fence_wait(intel->last_swap_fence); -	 dri_fence_unreference(intel->last_swap_fence); -	 intel->last_swap_fence = NULL; -      } -      if (intel->first_swap_fence) { -	 dri_fence_wait(intel->first_swap_fence); -	 dri_fence_unreference(intel->first_swap_fence); -	 intel->first_swap_fence = NULL; -      } - -      if (release_texture_heaps) { -         /* This share group is about to go away, free our private -          * texture object data. -          */ -         if (INTEL_DEBUG & DEBUG_TEXTURE) -            fprintf(stderr, "do something to free texture heaps\n"); -      } - -      /* free the Mesa context */ -      _mesa_free_context_data(&intel->ctx); - -      dri_bufmgr_destroy(intel->bufmgr); -   } -} - -GLboolean -intelUnbindContext(__DRIcontextPrivate * driContextPriv) -{ -   return GL_TRUE; -} - -GLboolean -intelMakeCurrent(__DRIcontextPrivate * driContextPriv, -                 __DRIdrawablePrivate * driDrawPriv, -                 __DRIdrawablePrivate * driReadPriv) -{ - -   if (driContextPriv) { -      struct intel_context *intel = -         (struct intel_context *) driContextPriv->driverPrivate; -      struct intel_framebuffer *intel_fb = -	 (struct intel_framebuffer *) driDrawPriv->driverPrivate; -      GLframebuffer *readFb = (GLframebuffer *) driReadPriv->driverPrivate; - - -      /* XXX FBO temporary fix-ups! */ -      /* if the renderbuffers don't have regions, init them from the context */ -      if (!driContextPriv->driScreenPriv->dri2.enabled) { -         struct intel_renderbuffer *irbDepth -            = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH); -         struct intel_renderbuffer *irbStencil -            = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL); - -         if (intel_fb->color_rb[0]) { -	    intel_renderbuffer_set_region(intel_fb->color_rb[0], -					  intel->front_region); -         } -         if (intel_fb->color_rb[1]) { -	    intel_renderbuffer_set_region(intel_fb->color_rb[1], -					  intel->back_region); -         } -         if (intel_fb->color_rb[2]) { -	    intel_renderbuffer_set_region(intel_fb->color_rb[2], -					  intel->third_region); -         } -         if (irbDepth) { -	    intel_renderbuffer_set_region(irbDepth, intel->depth_region); -         } -         if (irbStencil) { -	    intel_renderbuffer_set_region(irbStencil, intel->depth_region); -         } -      } - -      /* set GLframebuffer size to match window, if needed */ -      driUpdateFramebufferSize(&intel->ctx, driDrawPriv); - -      if (driReadPriv != driDrawPriv) { -	 driUpdateFramebufferSize(&intel->ctx, driReadPriv); -      } - -      _mesa_make_current(&intel->ctx, &intel_fb->Base, readFb); - -      /* The drawbuffer won't always be updated by _mesa_make_current:  -       */ -      if (intel->ctx.DrawBuffer == &intel_fb->Base) { - -	 if (intel->driDrawable != driDrawPriv) { -	    if (driDrawPriv->swap_interval == (unsigned)-1) { -	       int i; - -	       driDrawPriv->vblFlags = (intel->intelScreen->irq_active != 0) -		  ? driGetDefaultVBlankFlags(&intel->optionCache) -		 : VBLANK_FLAG_NO_IRQ; - -	       (*dri_interface->getUST) (&intel_fb->swap_ust); -	       driDrawableInitVBlank(driDrawPriv); -	       intel_fb->vbl_waited = driDrawPriv->vblSeq; - -	       for (i = 0; i < (intel->intelScreen->third.handle ? 3 : 2); i++) { -		  if (intel_fb->color_rb[i]) -		     intel_fb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq; -	       } -	    } -	    intel->driDrawable = driDrawPriv; -	    intelWindowMoved(intel); -	 } - -	 intel_draw_buffer(&intel->ctx, &intel_fb->Base); -      } -   } -   else { -      _mesa_make_current(NULL, NULL, NULL); -   } - -   return GL_TRUE; -} - -static void -intelContendedLock(struct intel_context *intel, GLuint flags) -{ -   __DRIdrawablePrivate *dPriv = intel->driDrawable; -   __DRIscreenPrivate *sPriv = intel->driScreen; -   struct drm_i915_sarea *sarea = intel->sarea; -   int drawable_changed = 0; - -   drmGetLock(intel->driFd, intel->hHWContext, flags); - -   if (INTEL_DEBUG & DEBUG_LOCK) -      _mesa_printf("%s - got contended lock\n", __progname); - -   /* If the window moved, may need to set a new cliprect now. -    * -    * NOTE: This releases and regains the hw lock, so all state -    * checking must be done *after* this call: -    */ -   if (dPriv) { -      if (sPriv->dri2.enabled) -	 drawable_changed = __driParseEvents(sPriv, dPriv); -      else -	 DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv); -   } - -   /* If the last consumer of the texture memory wasn't us, notify the fake -    * bufmgr and record the new owner.  We should have the memory shared -    * between contexts of a single fake bufmgr, but this will at least make -    * things correct for now. -    */ -   if (!intel->ttm && sarea->texAge != intel->hHWContext) { -      sarea->texAge = intel->hHWContext; -      dri_bufmgr_fake_contended_lock_take(intel->bufmgr); -      if (INTEL_DEBUG & DEBUG_BATCH) -	 intel_decode_context_reset(); -   } - -   if (!sPriv->dri2.enabled) { -      if (sarea->width != intel->width || -	  sarea->height != intel->height) { -	 int numClipRects = intel->numClipRects; - -	 /* -	  * FIXME: Really only need to do this when drawing to a -	  * common back- or front buffer. -	  */ - -	 /* -	  * This will essentially drop the outstanding batchbuffer on the floor. -	  */ -	 intel->numClipRects = 0; - -	 if (intel->Fallback) -	    _swrast_flush(&intel->ctx); - -	 INTEL_FIREVERTICES(intel); - -	 if (intel->batch->map != intel->batch->ptr) -	    intel_batchbuffer_flush(intel->batch); - -	 intel->numClipRects = numClipRects; - -	 /* force window update */ -	 intel->lastStamp = 0; - -	 intel->width = sarea->width; -	 intel->height = sarea->height; -      } - -      /* Drawable changed? -       */ -      if (dPriv && intel->lastStamp != dPriv->lastStamp) { -	 intelWindowMoved(intel); -	 intel->lastStamp = dPriv->lastStamp; -      } -   } else if (drawable_changed) { -     intelWindowMoved(intel);                                                  -     intel_draw_buffer(&intel->ctx, intel->ctx.DrawBuffer); -   } -} - - - -/* Lock the hardware and validate our state.   - */ -void LOCK_HARDWARE( struct intel_context *intel ) -{ -    __DRIdrawablePrivate *dPriv = intel->driDrawable; -    char __ret=0; -    struct intel_framebuffer *intel_fb = NULL; -    struct intel_renderbuffer *intel_rb = NULL; -    _glthread_LOCK_MUTEX(lockMutex); -    assert(!intel->locked); - -    if (intel->driDrawable) { -       intel_fb = intel->driDrawable->driverPrivate; - -       if (intel_fb) -	  intel_rb = -	     intel_get_renderbuffer(&intel_fb->Base, -				    intel_fb->Base._ColorDrawBufferIndexes[0]); -    } - -    if (intel_rb && dPriv->vblFlags && -	!(dPriv->vblFlags & VBLANK_FLAG_NO_IRQ) && -	(intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) { -	drmVBlank vbl; - -	vbl.request.type = DRM_VBLANK_ABSOLUTE; - -	if ( dPriv->vblFlags & VBLANK_FLAG_SECONDARY ) { -	    vbl.request.type |= DRM_VBLANK_SECONDARY; -	} - -	vbl.request.sequence = intel_rb->vbl_pending; -	drmWaitVBlank(intel->driFd, &vbl); -	intel_fb->vbl_waited = vbl.reply.sequence; -    } - -    DRM_CAS(intel->driHwLock, intel->hHWContext, -        (DRM_LOCK_HELD|intel->hHWContext), __ret); - -    intel->locked = 1; - -    if (__ret) -        intelContendedLock( intel, 0 ); - -    if (INTEL_DEBUG & DEBUG_LOCK) -      _mesa_printf("%s - locked\n", __progname); -} - - -  /* Unlock the hardware using the global current context  -   */ -void UNLOCK_HARDWARE( struct intel_context *intel ) -{ -   intel->locked = 0; - -   DRM_UNLOCK(intel->driFd, intel->driHwLock, intel->hHWContext); - -   _glthread_UNLOCK_MUTEX(lockMutex); - -   if (INTEL_DEBUG & DEBUG_LOCK) -      _mesa_printf("%s - unlocked\n", __progname); - -   /** -    * Nothing should be left in batch outside of LOCK/UNLOCK which references -    * cliprects. -    */ -   assert(intel->batch->cliprect_mode != REFERENCES_CLIPRECTS); -} - +../intel/intel_context.c
\ No newline at end of file diff --git a/src/mesa/drivers/dri/i965/brw_metaops.c b/src/mesa/drivers/dri/i965/brw_metaops.c index 56185dbf71..525748408d 100644 --- a/src/mesa/drivers/dri/i965/brw_metaops.c +++ b/src/mesa/drivers/dri/i965/brw_metaops.c @@ -41,6 +41,7 @@  #include "intel_screen.h"  #include "intel_batchbuffer.h"  #include "intel_regions.h" +#include "intel_buffers.h"  #include "brw_context.h"  #include "brw_defines.h" diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c b/src/mesa/drivers/dri/i965/brw_misc_state.c index 450d62c71f..ba90496d19 100644 --- a/src/mesa/drivers/dri/i965/brw_misc_state.c +++ b/src/mesa/drivers/dri/i965/brw_misc_state.c @@ -295,6 +295,8 @@ static void upload_polygon_stipple_offset(struct brw_context *brw)     BRW_CACHED_BATCH_STRUCT(brw, &bpso);  } +#define _NEW_WINDOW_POS 0x40000000 +  const struct brw_tracked_state brw_polygon_stipple_offset = {     .dirty = {        .mesa = _NEW_WINDOW_POS, diff --git a/src/mesa/drivers/dri/i965/intel_context.c b/src/mesa/drivers/dri/i965/intel_context.c index c39c0c2f0f..93899dfef1 100644 --- a/src/mesa/drivers/dri/i965/intel_context.c +++ b/src/mesa/drivers/dri/i965/intel_context.c @@ -61,6 +61,7 @@  #include "intel_decode.h"  #include "intel_fbo.h"  #include "intel_bufmgr_ttm.h" +#include "intel_pixel.h"  #include "drirenderbuffer.h"  #include "i915_drm.h" @@ -235,7 +236,7 @@ const struct dri_extension arb_oc_extensions[] = {   * Initializes potential list of extensions if ctx == NULL, or actually enables   * extensions for a context.   */ -void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging) +static void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging)  {     struct intel_context *intel = ctx?intel_context(ctx):NULL; diff --git a/src/mesa/drivers/dri/i965/intel_context.h b/src/mesa/drivers/dri/i965/intel_context.h deleted file mode 100644 index 6b69c9c866..0000000000 --- a/src/mesa/drivers/dri/i965/intel_context.h +++ /dev/null @@ -1,453 +0,0 @@ -/************************************************************************** - *  - * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *  - **************************************************************************/ - -#ifndef INTELCONTEXT_INC -#define INTELCONTEXT_INC - - - -#include "mtypes.h" -#include "drm.h" -#include "texmem.h" -#include "dri_bufmgr.h" - -#include "intel_screen.h" -#include "intel_tex_obj.h" -#include "i915_drm.h" -#include "tnl/t_vertex.h" - -#define TAG(x) intel##x -#include "tnl_dd/t_dd_vertex.h" -#undef TAG - -#define DV_PF_555  (1<<8) -#define DV_PF_565  (2<<8) -#define DV_PF_8888 (3<<8) - -struct intel_region; -struct intel_context; - -typedef void (*intel_tri_func)(struct intel_context *, intelVertex *, intelVertex *, -							  intelVertex *); -typedef void (*intel_line_func)(struct intel_context *, intelVertex *, intelVertex *); -typedef void (*intel_point_func)(struct intel_context *, intelVertex *); - -#define INTEL_FALLBACK_DRAW_BUFFER	 0x1 -#define INTEL_FALLBACK_READ_BUFFER	 0x2 -#define INTEL_FALLBACK_USER		 0x4 -#define INTEL_FALLBACK_RENDERMODE	 0x8 -#define INTEL_FALLBACK_TEXTURE   	 0x10 -#define INTEL_FALLBACK_DEPTH_BUFFER	 0x20 -#define INTEL_FALLBACK_STENCIL_BUFFER	 0x40 - -extern void intelFallback( struct intel_context *intel, GLuint bit, GLboolean mode ); -#define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode ) - -#define INTEL_WRITE_PART  0x1 -#define INTEL_WRITE_FULL  0x2 -#define INTEL_READ        0x4 - -struct intel_context -{ -   GLcontext ctx;		/* the parent class */ - -   struct { -      void (*destroy)( struct intel_context *intel );  -      void (*emit_state)( struct intel_context *intel ); -      void (*emit_invarient_state)( struct intel_context *intel ); -      void (*new_batch)( struct intel_context *intel ); -      void (*note_fence)( struct intel_context *intel, GLuint fence ); -      void (*note_unlock)( struct intel_context *intel ); -      void (*update_texture_state)( struct intel_context *intel ); - -      void (*render_start)( struct intel_context *intel ); -      void (*set_draw_region)( struct intel_context *intel,  -			       struct intel_region *draw_region, -			       struct intel_region *depth_region ); - -      GLuint (*flush_cmd)( void ); - -      void (*emit_flush)( struct intel_context *intel, -			  GLuint unused ); - -      void (*reduced_primitive_state)( struct intel_context *intel, GLenum rprim ); - -      GLboolean (*check_vertex_size)( struct intel_context *intel, GLuint expected ); - -      void (*invalidate_state)( struct intel_context *intel, GLuint new_state ); - -      /* Metaops:  -       */ -      void (*install_meta_state)( struct intel_context *intel ); -      void (*leave_meta_state)( struct intel_context *intel ); - -      void (*meta_draw_region)( struct intel_context *intel, -				struct intel_region *draw_region, -				struct intel_region *depth_region ); - -      void (*meta_color_mask)( struct intel_context *intel, -			       GLboolean ); -       -      void (*meta_stencil_replace)( struct intel_context *intel, -				    GLuint mask, -				    GLuint clear ); - -      void (*meta_depth_replace)( struct intel_context *intel ); - -      void (*meta_texture_blend_replace) (struct intel_context * intel); -       -      void (*meta_no_stencil_write)( struct intel_context *intel ); -      void (*meta_no_depth_write)( struct intel_context *intel ); -      void (*meta_no_texture)( struct intel_context *intel ); -      void (*meta_import_pixel_state) (struct intel_context * intel); -      void (*meta_frame_buffer_texture)( struct intel_context *intel, -					 GLint xoff, GLint yoff ); - -      void (*meta_draw_quad)(struct intel_context *intel, -			     GLfloat x0, GLfloat x1, -			     GLfloat y0, GLfloat y1, -			     GLfloat z, -			     GLuint color, /* ARGB32 */ -			     GLfloat s0, GLfloat s1, -			     GLfloat t0, GLfloat t1); - -      void (*debug_batch)(struct intel_context *intel); -   } vtbl; - -   GLint refcount;    -   GLuint Fallback; -   GLuint NewGLState; - -   dri_bufmgr *bufmgr; -   unsigned int maxBatchSize; - -   struct intel_region *front_region; -   struct intel_region *back_region; -   struct intel_region *third_region; -   struct intel_region *depth_region; - -   /** -    * This value indicates that the kernel memory manager is being used -    * instead of the fake client-side memory manager. -    */ -   GLboolean ttm; - -   dri_fence *first_swap_fence; -   dri_fence *last_swap_fence; - -   GLuint stats_wm; - -   struct intel_batchbuffer *batch; -   unsigned batch_id; - -   GLubyte clear_chan[4]; -   GLuint ClearColor565; -   GLuint ClearColor8888; - -   GLfloat polygon_offset_scale; /* dependent on depth_scale, bpp */ - -   GLboolean hw_stencil; -   GLboolean hw_stipple; -   GLboolean depth_buffer_is_float; -   GLboolean no_rast; -   GLboolean locked; -   GLboolean strict_conformance; - -   /* State for intelvb.c and inteltris.c. -    */ -   GLenum render_primitive; -   GLenum reduced_primitive; - -   struct intel_region *draw_region; - -   /* These refer to the current draw (front vs. back) buffer: -    */ -   int drawX;			/* origin of drawable in draw buffer */ -   int drawY; -   GLuint numClipRects;		/* cliprects for that buffer */ -   drm_clip_rect_t *pClipRects; -   struct gl_texture_object *frame_buffer_texobj; -   drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */ - -   GLboolean scissor; -   drm_clip_rect_t draw_rect; -   drm_clip_rect_t scissor_rect; - -   drm_context_t hHWContext; -   drmLock *driHwLock; -   int driFd; - -   __DRIdrawablePrivate *driDrawable; -   __DRIdrawablePrivate *driReadDrawable; -   __DRIscreenPrivate *driScreen; -   intelScreenPrivate *intelScreen;  -   volatile struct drm_i915_sarea *sarea;  - -   GLuint lastStamp; - -   GLboolean no_hw; - -   /** -    * Configuration cache -    */ -   driOptionCache optionCache; - -   int64_t swap_ust; -   int64_t swap_missed_ust; - -   GLuint swap_count; -   GLuint swap_missed_count; -}; - -/* These are functions now: - */ -void LOCK_HARDWARE( struct intel_context *intel ); -void UNLOCK_HARDWARE( struct intel_context *intel ); - - -#define SUBPIXEL_X 0.125 -#define SUBPIXEL_Y 0.125 - -#define ALIGN(value, alignment)  ((value + alignment - 1) & ~(alignment - 1)) - -/* ================================================================ - * Color packing: - */ - -#define INTEL_PACKCOLOR4444(r,g,b,a) \ -  ((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4)) - -#define INTEL_PACKCOLOR1555(r,g,b,a) \ -  ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \ -    ((a) ? 0x8000 : 0)) - -#define INTEL_PACKCOLOR565(r,g,b) \ -  ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3)) - -#define INTEL_PACKCOLOR8888(r,g,b,a) \ -  ((a<<24) | (r<<16) | (g<<8) | b) - - -#define INTEL_PACKCOLOR(format, r,  g,  b, a)		\ -(format == DV_PF_555 ? INTEL_PACKCOLOR1555(r,g,b,a) :	\ - (format == DV_PF_565 ? INTEL_PACKCOLOR565(r,g,b) :	\ -  (format == DV_PF_8888 ? INTEL_PACKCOLOR8888(r,g,b,a) :	\ -   0))) - - - -/* ================================================================ - * From linux kernel i386 header files, copes with odd sizes better - * than COPY_DWORDS would: - */ -#if defined(i386) || defined(__i386__) -static inline void * __memcpy(void * to, const void * from, size_t n) -{ -   int d0, d1, d2; -   __asm__ __volatile__( -      "rep ; movsl\n\t" -      "testb $2,%b4\n\t" -      "je 1f\n\t" -      "movsw\n" -      "1:\ttestb $1,%b4\n\t" -      "je 2f\n\t" -      "movsb\n" -      "2:" -      : "=&c" (d0), "=&D" (d1), "=&S" (d2) -      :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) -      : "memory"); -   return (to); -} -#else -#define __memcpy(a,b,c) memcpy(a,b,c) -#endif - - -/* ================================================================ - * Debugging: - */ -extern int INTEL_DEBUG; - -#define DEBUG_TEXTURE	0x1 -#define DEBUG_STATE	0x2 -#define DEBUG_IOCTL	0x4 -#define DEBUG_PRIMS	0x8 -#define DEBUG_VERTS	0x10 -#define DEBUG_FALLBACKS	0x20 -#define DEBUG_VERBOSE	0x40 -#define DEBUG_DRI       0x80 -#define DEBUG_DMA       0x100 -#define DEBUG_SANITY    0x200 -#define DEBUG_SYNC      0x400 -#define DEBUG_SLEEP     0x800 -#define DEBUG_PIXEL     0x1000 -#define DEBUG_STATS     0x2000 -#define DEBUG_TILE      0x4000 -#define DEBUG_SINGLE_THREAD   0x8000 -#define DEBUG_WM        0x10000 -#define DEBUG_URB       0x20000 -#define DEBUG_VS        0x40000 -#define DEBUG_BATCH	0x80000 -#define DEBUG_BUFMGR	0x100000 -#define DEBUG_BLIT	0x200000 -#define DEBUG_REGION	0x400000 -#define DEBUG_MIPTREE	0x800000 -#define DEBUG_FBO	0x1000000 - -#define DBG(...) do {						\ -	if (INTEL_DEBUG & FILE_DEBUG_FLAG)			\ -		_mesa_printf(__VA_ARGS__);			\ -} while(0) - -/* ================================================================ - * intel_context.c: - */ - -extern GLboolean intelInitContext( struct intel_context *intel,  -				   const __GLcontextModes *mesaVis, -				   __DRIcontextPrivate *driContextPriv, -				   void *sharedContextPrivate, -				   struct dd_function_table *functions ); - -extern void intelGetLock(struct intel_context *intel, GLuint flags); - -extern void intelFinish( GLcontext *ctx ); -extern void intelFlush( GLcontext *ctx ); - -extern void intelInitDriverFunctions( struct dd_function_table *functions ); - - -/* ================================================================ - * intel_state.c: - */ -extern void intelInitStateFuncs( struct dd_function_table *functions ); - -#define COMPAREFUNC_ALWAYS		0 -#define COMPAREFUNC_NEVER		0x1 -#define COMPAREFUNC_LESS		0x2 -#define COMPAREFUNC_EQUAL		0x3 -#define COMPAREFUNC_LEQUAL		0x4 -#define COMPAREFUNC_GREATER		0x5 -#define COMPAREFUNC_NOTEQUAL		0x6 -#define COMPAREFUNC_GEQUAL		0x7 - -#define STENCILOP_KEEP			0 -#define STENCILOP_ZERO			0x1 -#define STENCILOP_REPLACE		0x2 -#define STENCILOP_INCRSAT		0x3 -#define STENCILOP_DECRSAT		0x4 -#define STENCILOP_INCR			0x5 -#define STENCILOP_DECR			0x6 -#define STENCILOP_INVERT		0x7 - -#define LOGICOP_CLEAR			0 -#define LOGICOP_NOR			0x1 -#define LOGICOP_AND_INV 		0x2 -#define LOGICOP_COPY_INV		0x3 -#define LOGICOP_AND_RVRSE		0x4 -#define LOGICOP_INV			0x5 -#define LOGICOP_XOR			0x6 -#define LOGICOP_NAND			0x7 -#define LOGICOP_AND			0x8 -#define LOGICOP_EQUIV			0x9 -#define LOGICOP_NOOP			0xa -#define LOGICOP_OR_INV			0xb -#define LOGICOP_COPY			0xc -#define LOGICOP_OR_RVRSE		0xd -#define LOGICOP_OR			0xe -#define LOGICOP_SET			0xf - -#define BLENDFACT_ZERO			0x01 -#define BLENDFACT_ONE			0x02 -#define BLENDFACT_SRC_COLR		0x03 -#define BLENDFACT_INV_SRC_COLR 		0x04 -#define BLENDFACT_SRC_ALPHA		0x05 -#define BLENDFACT_INV_SRC_ALPHA 	0x06 -#define BLENDFACT_DST_ALPHA		0x07 -#define BLENDFACT_INV_DST_ALPHA 	0x08 -#define BLENDFACT_DST_COLR		0x09 -#define BLENDFACT_INV_DST_COLR		0x0a -#define BLENDFACT_SRC_ALPHA_SATURATE	0x0b -#define BLENDFACT_CONST_COLOR		0x0c -#define BLENDFACT_INV_CONST_COLOR	0x0d -#define BLENDFACT_CONST_ALPHA		0x0e -#define BLENDFACT_INV_CONST_ALPHA	0x0f -#define BLENDFACT_MASK          	0x0f - -extern int intel_translate_shadow_compare_func( GLenum func ); -extern int intel_translate_compare_func( GLenum func ); -extern int intel_translate_stencil_op( GLenum op ); -extern int intel_translate_blend_factor( GLenum factor ); -extern int intel_translate_logic_op( GLenum opcode ); - - -/* ================================================================ - * intel_buffers.c: - */ -void intelInitBufferFuncs( struct dd_function_table *functions ); - -struct intel_region *intel_readbuf_region( struct intel_context *intel ); -struct intel_region *intel_drawbuf_region( struct intel_context *intel ); - -extern void intelWindowMoved( struct intel_context *intel ); - -extern GLboolean intel_intersect_cliprects( drm_clip_rect_t *dest, -					    const drm_clip_rect_t *a, -					    const drm_clip_rect_t *b ); - - -/* ================================================================ - * intel_pixel_copy.c: - */ -void intelCopyPixels(GLcontext * ctx, -                     GLint srcx, GLint srcy, -                     GLsizei width, GLsizei height, -                     GLint destx, GLint desty, GLenum type); - -GLboolean intel_check_blit_fragment_ops(GLcontext * ctx); - -void intelBitmap(GLcontext * ctx, -		 GLint x, GLint y, -		 GLsizei width, GLsizei height, -		 const struct gl_pixelstore_attrib *unpack, -		 const GLubyte * pixels); - -void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging); -#define _NEW_WINDOW_POS 0x40000000 - - -/*====================================================================== - * Inline conversion functions.   - * These are better-typed than the macros used previously: - */ -static inline struct intel_context *intel_context( GLcontext *ctx ) -{ -   return (struct intel_context *)ctx; -} - -#endif - diff --git a/src/mesa/drivers/dri/i965/intel_pixel_copy.c b/src/mesa/drivers/dri/i965/intel_pixel_copy.c index 70da03da09..2f9c621dae 100644 --- a/src/mesa/drivers/dri/i965/intel_pixel_copy.c +++ b/src/mesa/drivers/dri/i965/intel_pixel_copy.c @@ -39,6 +39,8 @@  #include "intel_batchbuffer.h"  #include "intel_blit.h"  #include "intel_regions.h" +#include "intel_buffers.h" +#include "intel_pixel.h"  #define FILE_DEBUG_FLAG DEBUG_PIXEL diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c new file mode 100644 index 0000000000..1c340f7940 --- /dev/null +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -0,0 +1,862 @@ +/************************************************************************** + *  + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + *  + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + *  + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + *  + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *  + **************************************************************************/ + + +#include "glheader.h" +#include "context.h" +#include "matrix.h" +#include "simple_list.h" +#include "extensions.h" +#include "framebuffer.h" +#include "imports.h" +#include "points.h" + +#include "swrast/swrast.h" +#include "swrast_setup/swrast_setup.h" +#include "tnl/tnl.h" + +#include "tnl/t_pipeline.h" +#include "tnl/t_vertex.h" + +#include "drivers/common/driverfuncs.h" + +#include "intel_screen.h" + +#include "i830_dri.h" + +#include "intel_chipset.h" +#include "intel_buffers.h" +#include "intel_tex.h" +#include "intel_span.h" +#include "intel_tris.h" +#include "intel_ioctl.h" +#include "intel_batchbuffer.h" +#include "intel_blit.h" +#include "intel_pixel.h" +#include "intel_regions.h" +#include "intel_buffer_objects.h" +#include "intel_fbo.h" +#include "intel_decode.h" +#include "intel_bufmgr_ttm.h" + +#include "drirenderbuffer.h" +#include "vblank.h" +#include "utils.h" +#include "xmlpool.h"            /* for symbolic values of enum-type options */ +#ifndef INTEL_DEBUG +int INTEL_DEBUG = (0); +#endif + +#define need_GL_ARB_multisample +#define need_GL_ARB_point_parameters +#define need_GL_ARB_texture_compression +#define need_GL_ARB_vertex_buffer_object +#define need_GL_ARB_vertex_program +#define need_GL_ARB_window_pos +#define need_GL_EXT_blend_color +#define need_GL_EXT_blend_equation_separate +#define need_GL_EXT_blend_func_separate +#define need_GL_EXT_blend_minmax +#define need_GL_EXT_cull_vertex +#define need_GL_EXT_fog_coord +#define need_GL_EXT_framebuffer_object +#define need_GL_EXT_multi_draw_arrays +#define need_GL_EXT_secondary_color +#define need_GL_NV_vertex_program +#include "extension_helper.h" + + +#define DRIVER_DATE                     "20061102" + +_glthread_Mutex lockMutex; +static GLboolean lockMutexInit = GL_FALSE; + + +static const GLubyte * +intelGetString(GLcontext * ctx, GLenum name) +{ +   const char *chipset; +   static char buffer[128]; + +   switch (name) { +   case GL_VENDOR: +      return (GLubyte *) "Tungsten Graphics, Inc"; +      break; + +   case GL_RENDERER: +      switch (intel_context(ctx)->intelScreen->deviceID) { +      case PCI_CHIP_845_G: +         chipset = "Intel(R) 845G"; +         break; +      case PCI_CHIP_I830_M: +         chipset = "Intel(R) 830M"; +         break; +      case PCI_CHIP_I855_GM: +         chipset = "Intel(R) 852GM/855GM"; +         break; +      case PCI_CHIP_I865_G: +         chipset = "Intel(R) 865G"; +         break; +      case PCI_CHIP_I915_G: +         chipset = "Intel(R) 915G"; +         break; +      case PCI_CHIP_E7221_G: +	 chipset = "Intel (R) E7221G (i915)"; +	 break; +      case PCI_CHIP_I915_GM: +         chipset = "Intel(R) 915GM"; +         break; +      case PCI_CHIP_I945_G: +         chipset = "Intel(R) 945G"; +         break; +      case PCI_CHIP_I945_GM: +         chipset = "Intel(R) 945GM"; +         break; +      case PCI_CHIP_I945_GME: +         chipset = "Intel(R) 945GME"; +         break; +      case PCI_CHIP_G33_G: +	 chipset = "Intel(R) G33"; +	 break; +      case PCI_CHIP_Q35_G: +	 chipset = "Intel(R) Q35"; +	 break; +      case PCI_CHIP_Q33_G: +	 chipset = "Intel(R) Q33"; +	 break; +      default: +         chipset = "Unknown Intel Chipset"; +         break; +      } + +      (void) driGetRendererString(buffer, chipset, DRIVER_DATE, 0); +      return (GLubyte *) buffer; + +   default: +      return NULL; +   } +} + + +/** + * Extension strings exported by the intel driver. + */ +const struct dri_extension card_extensions[] = { +   {"GL_ARB_multisample", GL_ARB_multisample_functions}, +   {"GL_ARB_multitexture", NULL}, +   {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions}, +   {"GL_ARB_texture_border_clamp", NULL}, +   {"GL_ARB_texture_compression", GL_ARB_texture_compression_functions}, +   {"GL_ARB_texture_cube_map", NULL}, +   {"GL_ARB_texture_env_add", NULL}, +   {"GL_ARB_texture_env_combine", NULL}, +   {"GL_ARB_texture_env_dot3", NULL}, +   {"GL_ARB_texture_mirrored_repeat", NULL}, +   {"GL_ARB_texture_rectangle", NULL}, +   {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions}, +   {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions}, +   {"GL_ARB_window_pos", GL_ARB_window_pos_functions}, +   {"GL_EXT_blend_color", GL_EXT_blend_color_functions}, +   {"GL_EXT_blend_equation_separate", +    GL_EXT_blend_equation_separate_functions}, +   {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions}, +   {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions}, +   {"GL_EXT_blend_subtract", NULL}, +   {"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions}, +   {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions}, +   {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions}, +#if 1                           /* XXX FBO temporary? */ +   {"GL_EXT_packed_depth_stencil", NULL}, +#endif +   {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions}, +   {"GL_EXT_stencil_wrap", NULL}, +   {"GL_EXT_texture_edge_clamp", NULL}, +   {"GL_EXT_texture_env_combine", NULL}, +   {"GL_EXT_texture_env_dot3", NULL}, +   {"GL_EXT_texture_filter_anisotropic", NULL}, +   {"GL_EXT_texture_lod_bias", NULL}, +   {"GL_3DFX_texture_compression_FXT1", NULL}, +   {"GL_APPLE_client_storage", NULL}, +   {"GL_MESA_pack_invert", NULL}, +   {"GL_MESA_ycbcr_texture", NULL}, +   {"GL_NV_blend_square", NULL}, +   {"GL_NV_vertex_program", GL_NV_vertex_program_functions}, +   {"GL_NV_vertex_program1_1", NULL}, +   { "GL_SGIS_generate_mipmap", NULL }, +   {NULL, NULL} +}; + +const struct dri_extension ttm_extensions[] = { +   {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions}, +   {"GL_ARB_pixel_buffer_object", NULL}, +   {NULL, NULL} +}; + +extern const struct tnl_pipeline_stage _intel_render_stage; + +static const struct tnl_pipeline_stage *intel_pipeline[] = { +   &_tnl_vertex_transform_stage, +   &_tnl_vertex_cull_stage, +   &_tnl_normal_transform_stage, +   &_tnl_lighting_stage, +   &_tnl_fog_coordinate_stage, +   &_tnl_texgen_stage, +   &_tnl_texture_transform_stage, +   &_tnl_point_attenuation_stage, +   &_tnl_vertex_program_stage, +#if 1 +   &_intel_render_stage,        /* ADD: unclipped rastersetup-to-dma */ +#endif +   &_tnl_render_stage, +   0, +}; + + +static const struct dri_debug_control debug_control[] = { +   {"tex", DEBUG_TEXTURE}, +   {"state", DEBUG_STATE}, +   {"ioctl", DEBUG_IOCTL}, +   {"blit", DEBUG_BLIT}, +   {"mip", DEBUG_MIPTREE}, +   {"fall", DEBUG_FALLBACKS}, +   {"verb", DEBUG_VERBOSE}, +   {"bat", DEBUG_BATCH}, +   {"pix", DEBUG_PIXEL}, +   {"buf", DEBUG_BUFMGR}, +   {"reg", DEBUG_REGION}, +   {"fbo", DEBUG_FBO}, +   {"lock", DEBUG_LOCK}, +   {"sync", DEBUG_SYNC}, +   {NULL, 0} +}; + + +static void +intelInvalidateState(GLcontext * ctx, GLuint new_state) +{ +   _swrast_InvalidateState(ctx, new_state); +   _swsetup_InvalidateState(ctx, new_state); +   _vbo_InvalidateState(ctx, new_state); +   _tnl_InvalidateState(ctx, new_state); +   _tnl_invalidate_vertex_state(ctx, new_state); +   intel_context(ctx)->NewGLState |= new_state; +} + + +void +intelFlush(GLcontext * ctx) +{ +   struct intel_context *intel = intel_context(ctx); + +   if (intel->Fallback) +      _swrast_flush(ctx); + +   INTEL_FIREVERTICES(intel); + +   if (intel->batch->map != intel->batch->ptr) +      intel_batchbuffer_flush(intel->batch); + +   /* XXX: Need to do an MI_FLUSH here. +    */ +} + +void +intelFinish(GLcontext * ctx) +{ +   struct intel_context *intel = intel_context(ctx); +   intelFlush(ctx); +   if (intel->batch->last_fence) { +      dri_fence_wait(intel->batch->last_fence); +      dri_fence_unreference(intel->batch->last_fence); +      intel->batch->last_fence = NULL; +   } +} + +/** Driver-specific fence emit implementation for the fake memory manager. */ +static unsigned int +intel_fence_emit(void *private) +{ +   struct intel_context *intel = (struct intel_context *)private; +   unsigned int fence; + +   /* XXX: Need to emit a flush, if we haven't already (at least with the +    * current batchbuffer implementation, we have). +    */ + +   fence = intelEmitIrqLocked(intel); + +   return fence; +} + +/** Driver-specific fence wait implementation for the fake memory manager. */ +static int +intel_fence_wait(void *private, unsigned int cookie) +{ +   struct intel_context *intel = (struct intel_context *)private; + +   intelWaitIrq(intel, cookie); + +   return 0; +} + +static GLboolean +intel_init_bufmgr(struct intel_context *intel) +{ +   intelScreenPrivate *intelScreen = intel->intelScreen; +   GLboolean ttm_disable = getenv("INTEL_NO_TTM") != NULL; + +   /* If we've got a new enough DDX that's initializing TTM and giving us +    * object handles for the shared buffers, use that. +    */ +   intel->ttm = GL_FALSE; +   if (!ttm_disable && +       intel->intelScreen->driScrnPriv->ddx_version.minor >= 9 && +       intel->intelScreen->drmMinor >= 11 && +       intel->intelScreen->front.bo_handle != -1) +   { +      intel->bufmgr = intel_bufmgr_ttm_init(intel->driFd, +					    DRM_FENCE_TYPE_EXE, +					    DRM_FENCE_TYPE_EXE | +					    DRM_I915_FENCE_TYPE_RW, +					    BATCH_SZ); +      if (intel->bufmgr != NULL) +	 intel->ttm = GL_TRUE; +   } +   /* Otherwise, use the classic buffer manager. */ +   if (intel->bufmgr == NULL) { +      if (ttm_disable) { +	 fprintf(stderr, "TTM buffer manager disabled.  Using classic.\n"); +      } else { +	 fprintf(stderr, "Failed to initialize TTM buffer manager.  " +		 "Falling back to classic.\n"); +      } + +      if (intelScreen->tex.size == 0) { +	 fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", +		 __func__, __LINE__); +	 return GL_FALSE; +      } + +      intel->bufmgr = dri_bufmgr_fake_init(intelScreen->tex.offset, +					   intelScreen->tex.map, +					   intelScreen->tex.size, +					   intel_fence_emit, +					   intel_fence_wait, +					   intel); +   } + +   return GL_TRUE; +} + +void +intelInitDriverFunctions(struct dd_function_table *functions) +{ +   _mesa_init_driver_functions(functions); + +   functions->Flush = intelFlush; +   functions->Finish = intelFinish; +   functions->GetString = intelGetString; +   functions->UpdateState = intelInvalidateState; +   functions->CopyColorTable = _swrast_CopyColorTable; +   functions->CopyColorSubTable = _swrast_CopyColorSubTable; +   functions->CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; +   functions->CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; + +   intelInitTextureFuncs(functions); +   intelInitPixelFuncs(functions); +   intelInitStateFuncs(functions); +   intelInitBufferFuncs(functions); +} + + +GLboolean +intelInitContext(struct intel_context *intel, +                 const __GLcontextModes * mesaVis, +                 __DRIcontextPrivate * driContextPriv, +                 void *sharedContextPrivate, +                 struct dd_function_table *functions) +{ +   GLcontext *ctx = &intel->ctx; +   GLcontext *shareCtx = (GLcontext *) sharedContextPrivate; +   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; +   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; +   struct drm_i915_sarea *saPriv = (struct drm_i915_sarea *) +      (((GLubyte *) sPriv->pSAREA) + intelScreen->sarea_priv_offset); +   int fthrottle_mode; + +   if (!_mesa_initialize_context(&intel->ctx, +                                 mesaVis, shareCtx, +                                 functions, (void *) intel)) +      return GL_FALSE; + +   driContextPriv->driverPrivate = intel; +   intel->intelScreen = intelScreen; +   intel->driScreen = sPriv; +   intel->sarea = saPriv; + +   /* Dri stuff */ +   intel->hHWContext = driContextPriv->hHWContext; +   intel->driFd = sPriv->fd; +   intel->driHwLock = sPriv->lock; + +   intel->width = intelScreen->width; +   intel->height = intelScreen->height; + +   if (intelScreen->deviceID == PCI_CHIP_I865_G) +      intel->maxBatchSize = 4096; +   else +      intel->maxBatchSize = BATCH_SZ; + +   if (!intel_init_bufmgr(intel)) +      return GL_FALSE; + +   if (!lockMutexInit) { +      lockMutexInit = GL_TRUE; +      _glthread_INIT_MUTEX(lockMutex); +   } + +   driParseConfigFiles(&intel->optionCache, &intelScreen->optionCache, +                       intel->driScreen->myNum, "i915"); + +   ctx->Const.MaxTextureMaxAnisotropy = 2.0; + +   /* This doesn't yet catch all non-conformant rendering, but it's a +    * start. +    */ +   if (getenv("INTEL_STRICT_CONFORMANCE")) { +      intel->strict_conformance = 1; +   } + +   ctx->Const.MinLineWidth = 1.0; +   ctx->Const.MinLineWidthAA = 1.0; +   ctx->Const.MaxLineWidth = 3.0; +   ctx->Const.MaxLineWidthAA = 3.0; +   ctx->Const.LineWidthGranularity = 1.0; + +   ctx->Const.MinPointSize = 1.0; +   ctx->Const.MinPointSizeAA = 1.0; +   ctx->Const.MaxPointSize = 255.0; +   ctx->Const.MaxPointSizeAA = 3.0; +   ctx->Const.PointSizeGranularity = 1.0; + +   /* reinitialize the context point state. +    * It depend on constants in __GLcontextRec::Const +    */ +   _mesa_init_point(ctx); + +   ctx->Const.MaxColorAttachments = 4;  /* XXX FBO: review this */ + +   /* Initialize the software rasterizer and helper modules. */ +   _swrast_CreateContext(ctx); +   _vbo_CreateContext(ctx); +   _tnl_CreateContext(ctx); +   _swsetup_CreateContext(ctx); + +   /* Install the customized pipeline: */ +   _tnl_destroy_pipeline(ctx); +   _tnl_install_pipeline(ctx, intel_pipeline); + +   /* Configure swrast to match hardware characteristics: */ +   _swrast_allow_pixel_fog(ctx, GL_FALSE); +   _swrast_allow_vertex_fog(ctx, GL_TRUE); + +   intel->hw_stipple = 1; + +   /* XXX FBO: this doesn't seem to be used anywhere */ +   switch (mesaVis->depthBits) { +   case 0:                     /* what to do in this case? */ +   case 16: +      intel->polygon_offset_scale = 1.0; +      break; +   case 24: +      intel->polygon_offset_scale = 2.0;     /* req'd to pass glean */ +      break; +   default: +      assert(0); +      break; +   } + +   /* Initialize swrast, tnl driver tables: */ +   intelInitSpanFuncs(ctx); +   intelInitTriFuncs(ctx); + + +   intel->RenderIndex = ~0; + +   fthrottle_mode = driQueryOptioni(&intel->optionCache, "fthrottle_mode"); +   intel->irqsEmitted = 0; + +   intel->do_irqs = (intel->intelScreen->irq_active && +                     fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS); + +   intel->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS); + +   _math_matrix_ctr(&intel->ViewportMatrix); + +   /* Disable imaging extension until convolution is working in +    * teximage paths: +    */ +   driInitExtensions(ctx, card_extensions, +/* 		      GL_TRUE, */ +                     GL_FALSE); + +   if (intel->ttm) +      driInitExtensions(ctx, ttm_extensions, GL_FALSE); + +   if (!sPriv->dri2.enabled) +      intel_recreate_static_regions(intel); + +   intel->batch = intel_batchbuffer_alloc(intel); +   intel->last_swap_fence = NULL; +   intel->first_swap_fence = NULL; + +   intel_bufferobj_init(intel); +   intel_fbo_init(intel); + +   if (intel->ctx.Mesa_DXTn) { +      _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); +      _mesa_enable_extension(ctx, "GL_S3_s3tc"); +   } +   else if (driQueryOptionb(&intel->optionCache, "force_s3tc_enable")) { +      _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); +   } + +   intel->prim.primitive = ~0; + +#if DO_DEBUG +   INTEL_DEBUG = driParseDebugString(getenv("INTEL_DEBUG"), debug_control); +   if (INTEL_DEBUG & DEBUG_BUFMGR) +      dri_bufmgr_set_debug(intel->bufmgr, GL_TRUE); +#endif + +   if (driQueryOptionb(&intel->optionCache, "no_rast")) { +      fprintf(stderr, "disabling 3D rasterization\n"); +      FALLBACK(intel, INTEL_FALLBACK_USER, 1); +   } + +   /* Disable all hardware rendering (skip emitting batches and fences/waits +    * to the kernel) +    */ +   intel->no_hw = getenv("INTEL_NO_HW") != NULL; + +   return GL_TRUE; +} + +void +intelDestroyContext(__DRIcontextPrivate * driContextPriv) +{ +   struct intel_context *intel = +      (struct intel_context *) driContextPriv->driverPrivate; + +   assert(intel);               /* should never be null */ +   if (intel) { +      GLboolean release_texture_heaps; + +      INTEL_FIREVERTICES(intel); + +      intel->vtbl.destroy(intel); + +      release_texture_heaps = (intel->ctx.Shared->RefCount == 1); +      _swsetup_DestroyContext(&intel->ctx); +      _tnl_DestroyContext(&intel->ctx); +      _vbo_DestroyContext(&intel->ctx); + +      _swrast_DestroyContext(&intel->ctx); +      intel->Fallback = 0;      /* don't call _swrast_Flush later */ + +      intel_batchbuffer_free(intel->batch); + +      if (intel->last_swap_fence) { +	 dri_fence_wait(intel->last_swap_fence); +	 dri_fence_unreference(intel->last_swap_fence); +	 intel->last_swap_fence = NULL; +      } +      if (intel->first_swap_fence) { +	 dri_fence_wait(intel->first_swap_fence); +	 dri_fence_unreference(intel->first_swap_fence); +	 intel->first_swap_fence = NULL; +      } + +      if (release_texture_heaps) { +         /* This share group is about to go away, free our private +          * texture object data. +          */ +         if (INTEL_DEBUG & DEBUG_TEXTURE) +            fprintf(stderr, "do something to free texture heaps\n"); +      } + +      /* free the Mesa context */ +      _mesa_free_context_data(&intel->ctx); + +      dri_bufmgr_destroy(intel->bufmgr); +   } +} + +GLboolean +intelUnbindContext(__DRIcontextPrivate * driContextPriv) +{ +   return GL_TRUE; +} + +GLboolean +intelMakeCurrent(__DRIcontextPrivate * driContextPriv, +                 __DRIdrawablePrivate * driDrawPriv, +                 __DRIdrawablePrivate * driReadPriv) +{ + +   if (driContextPriv) { +      struct intel_context *intel = +         (struct intel_context *) driContextPriv->driverPrivate; +      struct intel_framebuffer *intel_fb = +	 (struct intel_framebuffer *) driDrawPriv->driverPrivate; +      GLframebuffer *readFb = (GLframebuffer *) driReadPriv->driverPrivate; + + +      /* XXX FBO temporary fix-ups! */ +      /* if the renderbuffers don't have regions, init them from the context */ +      if (!driContextPriv->driScreenPriv->dri2.enabled) { +         struct intel_renderbuffer *irbDepth +            = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH); +         struct intel_renderbuffer *irbStencil +            = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL); + +         if (intel_fb->color_rb[0]) { +	    intel_renderbuffer_set_region(intel_fb->color_rb[0], +					  intel->front_region); +         } +         if (intel_fb->color_rb[1]) { +	    intel_renderbuffer_set_region(intel_fb->color_rb[1], +					  intel->back_region); +         } +         if (intel_fb->color_rb[2]) { +	    intel_renderbuffer_set_region(intel_fb->color_rb[2], +					  intel->third_region); +         } +         if (irbDepth) { +	    intel_renderbuffer_set_region(irbDepth, intel->depth_region); +         } +         if (irbStencil) { +	    intel_renderbuffer_set_region(irbStencil, intel->depth_region); +         } +      } + +      /* set GLframebuffer size to match window, if needed */ +      driUpdateFramebufferSize(&intel->ctx, driDrawPriv); + +      if (driReadPriv != driDrawPriv) { +	 driUpdateFramebufferSize(&intel->ctx, driReadPriv); +      } + +      _mesa_make_current(&intel->ctx, &intel_fb->Base, readFb); + +      /* The drawbuffer won't always be updated by _mesa_make_current:  +       */ +      if (intel->ctx.DrawBuffer == &intel_fb->Base) { + +	 if (intel->driDrawable != driDrawPriv) { +	    if (driDrawPriv->swap_interval == (unsigned)-1) { +	       int i; + +	       driDrawPriv->vblFlags = (intel->intelScreen->irq_active != 0) +		  ? driGetDefaultVBlankFlags(&intel->optionCache) +		 : VBLANK_FLAG_NO_IRQ; + +	       (*dri_interface->getUST) (&intel_fb->swap_ust); +	       driDrawableInitVBlank(driDrawPriv); +	       intel_fb->vbl_waited = driDrawPriv->vblSeq; + +	       for (i = 0; i < (intel->intelScreen->third.handle ? 3 : 2); i++) { +		  if (intel_fb->color_rb[i]) +		     intel_fb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq; +	       } +	    } +	    intel->driDrawable = driDrawPriv; +	    intelWindowMoved(intel); +	 } + +	 intel_draw_buffer(&intel->ctx, &intel_fb->Base); +      } +   } +   else { +      _mesa_make_current(NULL, NULL, NULL); +   } + +   return GL_TRUE; +} + +static void +intelContendedLock(struct intel_context *intel, GLuint flags) +{ +   __DRIdrawablePrivate *dPriv = intel->driDrawable; +   __DRIscreenPrivate *sPriv = intel->driScreen; +   struct drm_i915_sarea *sarea = intel->sarea; +   int drawable_changed = 0; + +   drmGetLock(intel->driFd, intel->hHWContext, flags); + +   if (INTEL_DEBUG & DEBUG_LOCK) +      _mesa_printf("%s - got contended lock\n", __progname); + +   /* If the window moved, may need to set a new cliprect now. +    * +    * NOTE: This releases and regains the hw lock, so all state +    * checking must be done *after* this call: +    */ +   if (dPriv) { +      if (sPriv->dri2.enabled) +	 drawable_changed = __driParseEvents(sPriv, dPriv); +      else +	 DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv); +   } + +   /* If the last consumer of the texture memory wasn't us, notify the fake +    * bufmgr and record the new owner.  We should have the memory shared +    * between contexts of a single fake bufmgr, but this will at least make +    * things correct for now. +    */ +   if (!intel->ttm && sarea->texAge != intel->hHWContext) { +      sarea->texAge = intel->hHWContext; +      dri_bufmgr_fake_contended_lock_take(intel->bufmgr); +      if (INTEL_DEBUG & DEBUG_BATCH) +	 intel_decode_context_reset(); +   } + +   if (!sPriv->dri2.enabled) { +      if (sarea->width != intel->width || +	  sarea->height != intel->height) { +	 int numClipRects = intel->numClipRects; + +	 /* +	  * FIXME: Really only need to do this when drawing to a +	  * common back- or front buffer. +	  */ + +	 /* +	  * This will essentially drop the outstanding batchbuffer on the floor. +	  */ +	 intel->numClipRects = 0; + +	 if (intel->Fallback) +	    _swrast_flush(&intel->ctx); + +	 INTEL_FIREVERTICES(intel); + +	 if (intel->batch->map != intel->batch->ptr) +	    intel_batchbuffer_flush(intel->batch); + +	 intel->numClipRects = numClipRects; + +	 /* force window update */ +	 intel->lastStamp = 0; + +	 intel->width = sarea->width; +	 intel->height = sarea->height; +      } + +      /* Drawable changed? +       */ +      if (dPriv && intel->lastStamp != dPriv->lastStamp) { +	 intelWindowMoved(intel); +	 intel->lastStamp = dPriv->lastStamp; +      } +   } else if (drawable_changed) { +     intelWindowMoved(intel);                                                  +     intel_draw_buffer(&intel->ctx, intel->ctx.DrawBuffer); +   } +} + + + +/* Lock the hardware and validate our state.   + */ +void LOCK_HARDWARE( struct intel_context *intel ) +{ +    __DRIdrawablePrivate *dPriv = intel->driDrawable; +    char __ret=0; +    struct intel_framebuffer *intel_fb = NULL; +    struct intel_renderbuffer *intel_rb = NULL; +    _glthread_LOCK_MUTEX(lockMutex); +    assert(!intel->locked); + +    if (intel->driDrawable) { +       intel_fb = intel->driDrawable->driverPrivate; + +       if (intel_fb) +	  intel_rb = +	     intel_get_renderbuffer(&intel_fb->Base, +				    intel_fb->Base._ColorDrawBufferIndexes[0]); +    } + +    if (intel_rb && dPriv->vblFlags && +	!(dPriv->vblFlags & VBLANK_FLAG_NO_IRQ) && +	(intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) { +	drmVBlank vbl; + +	vbl.request.type = DRM_VBLANK_ABSOLUTE; + +	if ( dPriv->vblFlags & VBLANK_FLAG_SECONDARY ) { +	    vbl.request.type |= DRM_VBLANK_SECONDARY; +	} + +	vbl.request.sequence = intel_rb->vbl_pending; +	drmWaitVBlank(intel->driFd, &vbl); +	intel_fb->vbl_waited = vbl.reply.sequence; +    } + +    DRM_CAS(intel->driHwLock, intel->hHWContext, +        (DRM_LOCK_HELD|intel->hHWContext), __ret); + +    intel->locked = 1; + +    if (__ret) +        intelContendedLock( intel, 0 ); + +    if (INTEL_DEBUG & DEBUG_LOCK) +      _mesa_printf("%s - locked\n", __progname); +} + + +  /* Unlock the hardware using the global current context  +   */ +void UNLOCK_HARDWARE( struct intel_context *intel ) +{ +   intel->locked = 0; + +   DRM_UNLOCK(intel->driFd, intel->driHwLock, intel->hHWContext); + +   _glthread_UNLOCK_MUTEX(lockMutex); + +   if (INTEL_DEBUG & DEBUG_LOCK) +      _mesa_printf("%s - unlocked\n", __progname); + +   /** +    * Nothing should be left in batch outside of LOCK/UNLOCK which references +    * cliprects. +    */ +   assert(intel->batch->cliprect_mode != REFERENCES_CLIPRECTS); +} + diff --git a/src/mesa/drivers/dri/i915/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h index 5ca2fb7bd8..818856d89a 100644 --- a/src/mesa/drivers/dri/i915/intel_context.h +++ b/src/mesa/drivers/dri/intel/intel_context.h @@ -64,6 +64,7 @@ typedef void (*intel_point_func) (struct intel_context *, intelVertex *);  #define INTEL_FALLBACK_STENCIL_BUFFER    0x8  #define INTEL_FALLBACK_USER		 0x10  #define INTEL_FALLBACK_RENDERMODE	 0x20 +#define INTEL_FALLBACK_TEXTURE   	 0x40  extern void intelFallback(struct intel_context *intel, GLuint bit,                            GLboolean mode); @@ -85,6 +86,9 @@ struct intel_context        void (*destroy) (struct intel_context * intel);        void (*emit_state) (struct intel_context * intel);        void (*new_batch) (struct intel_context * intel); +      void (*emit_invarient_state) (struct intel_context * intel); +      void (*note_fence) (struct intel_context *intel, GLuint fence); +      void (*note_unlock) (struct intel_context *intel);        void (*update_texture_state) (struct intel_context * intel);        void (*render_start) (struct intel_context * intel); @@ -93,13 +97,16 @@ struct intel_context                                 struct intel_region * draw_region,                                 struct intel_region * depth_region); -        GLuint(*flush_cmd) (void); +      GLuint (*flush_cmd) (void); +      void (*emit_flush) (struct intel_context *intel, GLuint unused);        void (*reduced_primitive_state) (struct intel_context * intel,                                         GLenum rprim); -        GLboolean(*check_vertex_size) (struct intel_context * intel, -                                       GLuint expected); +      GLboolean (*check_vertex_size) (struct intel_context * intel, +				      GLuint expected); +      void (*invalidate_state) (struct intel_context *intel, +				GLuint new_state);        /* Metaops:  @@ -133,6 +140,8 @@ struct intel_context        void (*meta_no_texture) (struct intel_context * intel);        void (*meta_import_pixel_state) (struct intel_context * intel); +      void (*meta_frame_buffer_texture) (struct intel_context *intel, +					 GLint xoff, GLint yoff);        GLboolean(*meta_tex_rect_source) (struct intel_context * intel,  					dri_bo * buffer, @@ -169,6 +178,7 @@ struct intel_context     struct intel_batchbuffer *batch;     GLboolean no_batch_wrap; +   unsigned batch_id;     struct     { @@ -178,10 +188,12 @@ struct intel_context        void (*flush) (struct intel_context *);     } prim; +   GLuint stats_wm;     GLboolean locked;     char *prevLockFile;     int prevLockLine; +   GLubyte clear_chan[4];     GLuint ClearColor565;     GLuint ClearColor8888; @@ -197,7 +209,10 @@ struct intel_context     GLfloat polygon_offset_scale;        /* dependent on depth_scale, bpp */ +   GLboolean hw_stencil;     GLboolean hw_stipple; +   GLboolean depth_buffer_is_float; +   GLboolean no_rast;     GLboolean strict_conformance;     /* State for intelvb.c and inteltris.c. @@ -208,6 +223,7 @@ struct intel_context     GLenum reduced_primitive;     GLuint vertex_size;     GLubyte *verts;              /* points to tnl->clipspace.vertex_buf */ +   struct intel_region *draw_region;     /* Fallback rasterization functions       */ @@ -220,6 +236,7 @@ struct intel_context     int drawX, drawY;            /**< origin of drawing area within region */     GLuint numClipRects;         /**< cliprects for drawing */     drm_clip_rect_t *pClipRects; +   struct gl_texture_object *frame_buffer_texobj;     drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */     int perf_boxes; @@ -228,14 +245,19 @@ struct intel_context     int do_irqs;     GLuint irqsEmitted; +   GLboolean scissor; +   drm_clip_rect_t draw_rect; +   drm_clip_rect_t scissor_rect; +     drm_context_t hHWContext;     drmLock *driHwLock;     int driFd;     __DRIdrawablePrivate *driDrawable; +   __DRIdrawablePrivate *driReadDrawable;     __DRIscreenPrivate *driScreen;     intelScreenPrivate *intelScreen; -   struct drm_i915_sarea *sarea; +   volatile struct drm_i915_sarea *sarea;     GLuint lastStamp; @@ -249,6 +271,12 @@ struct intel_context     /* Last seen width/height of the screen */     int width;     int height; + +   int64_t swap_ust; +   int64_t swap_missed_ust; + +   GLuint swap_count; +   GLuint swap_missed_count;  };  /* These are functions now: @@ -287,7 +315,11 @@ do {						\  #define INTEL_PACKCOLOR8888(r,g,b,a) \    ((a<<24) | (r<<16) | (g<<8) | b) - +#define INTEL_PACKCOLOR(format, r,  g,  b, a)		\ +(format == DV_PF_555 ? INTEL_PACKCOLOR1555(r,g,b,a) :	\ + (format == DV_PF_565 ? INTEL_PACKCOLOR565(r,g,b) :	\ +  (format == DV_PF_8888 ? INTEL_PACKCOLOR8888(r,g,b,a) :	\ +   0)))  /* ================================================================   * From linux kernel i386 header files, copes with odd sizes better @@ -295,19 +327,21 @@ do {						\   * XXX Put this in src/mesa/main/imports.h ???   */  #if defined(i386) || defined(__i386__) -static INLINE void * -__memcpy(void *to, const void *from, size_t n) +static inline void * __memcpy(void * to, const void * from, size_t n)  {     int d0, d1, d2; -   __asm__ __volatile__("rep ; movsl\n\t" -                        "testb $2,%b4\n\t" -                        "je 1f\n\t" -                        "movsw\n" -                        "1:\ttestb $1,%b4\n\t" -                        "je 2f\n\t" -                        "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2) -                        :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from) -                        :"memory"); +   __asm__ __volatile__( +      "rep ; movsl\n\t" +      "testb $2,%b4\n\t" +      "je 1f\n\t" +      "movsw\n" +      "1:\ttestb $1,%b4\n\t" +      "je 2f\n\t" +      "movsb\n" +      "2:" +      : "=&c" (d0), "=&D" (d1), "=&S" (d2) +      :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) +      : "memory");     return (to);  }  #else @@ -315,16 +349,10 @@ __memcpy(void *to, const void *from, size_t n)  #endif -  /* ================================================================   * Debugging:   */ -#define DO_DEBUG		1 -#if DO_DEBUG  extern int INTEL_DEBUG; -#else -#define INTEL_DEBUG		0 -#endif  #define DEBUG_TEXTURE	0x1  #define DEBUG_STATE	0x2 @@ -340,9 +368,23 @@ extern int INTEL_DEBUG;  #define DEBUG_FBO       0x800  #define DEBUG_LOCK      0x1000  #define DEBUG_SYNC	0x2000 +#define DEBUG_PRIMS	0x4000 +#define DEBUG_VERTS	0x8000 +#define DEBUG_DRI       0x10000 +#define DEBUG_DMA       0x20000 +#define DEBUG_SANITY    0x40000 +#define DEBUG_SLEEP     0x80000 +#define DEBUG_STATS     0x100000 +#define DEBUG_TILE      0x200000 +#define DEBUG_SINGLE_THREAD   0x400000 +#define DEBUG_WM        0x800000 +#define DEBUG_URB       0x1000000 +#define DEBUG_VS        0x2000000 -#define DBG(...)  do { if (INTEL_DEBUG & FILE_DEBUG_FLAG) _mesa_printf(__VA_ARGS__); } while(0) - +#define DBG(...) do {						\ +	if (INTEL_DEBUG & FILE_DEBUG_FLAG)			\ +		_mesa_printf(__VA_ARGS__);			\ +} while(0)  #define PCI_CHIP_845_G			0x2562  #define PCI_CHIP_I830_M			0x3577 diff --git a/src/mesa/drivers/dri/intel/intel_pixel.h b/src/mesa/drivers/dri/intel/intel_pixel.h index a6fcf90ce0..ea2319a01f 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel.h +++ b/src/mesa/drivers/dri/intel/intel_pixel.h @@ -60,4 +60,10 @@ void intelCopyPixels(GLcontext * ctx,                       GLsizei width, GLsizei height,                       GLint destx, GLint desty, GLenum type); +void intelBitmap(GLcontext * ctx, +		 GLint x, GLint y, +		 GLsizei width, GLsizei height, +		 const struct gl_pixelstore_attrib *unpack, +		 const GLubyte * pixels); +  #endif diff --git a/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c index 05b5a44bea..77b6c53cb3 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c @@ -41,6 +41,8 @@  #include "intel_blit.h"  #include "intel_regions.h"  #include "intel_buffer_objects.h" +#include "intel_buffers.h" +#include "intel_pixel.h"  | 
