⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intel_context.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************** *  * 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_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_DEBUGint INTEL_DEBUG = (0);#endif#define need_GL_NV_point_sprite#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_ARB_occlusion_query#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#define need_GL_ATI_separate_stencil#define need_GL_EXT_point_parameters#define need_GL_VERSION_2_0#define need_GL_VERSION_2_1#define need_GL_ARB_shader_objects#define need_GL_ARB_vertex_shader#include "extension_helper.h"#define DRIVER_DATE                     "20061102"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;      case PCI_CHIP_I965_Q:	 chipset = "Intel(R) 965Q";	 break;      case PCI_CHIP_I965_G:      case PCI_CHIP_I965_G_1:	 chipset = "Intel(R) 965G";	 break;      case PCI_CHIP_I946_GZ:	 chipset = "Intel(R) 946GZ";	 break;      case PCI_CHIP_I965_GM:	 chipset = "Intel(R) 965GM";	 break;      case PCI_CHIP_I965_GME:	 chipset = "Intel(R) 965GME/GLE";	 break;      case PCI_CHIP_GM45_GM:	 chipset = "Mobile Intel® GM45 Express Chipset";	 break;       case PCI_CHIP_IGD_E_G:	 chipset = "Intel(R) Integrated Graphics Device";	 break;      case PCI_CHIP_G45_G:         chipset = "Intel(R) G45/G43";         break;      case PCI_CHIP_Q45_G:         chipset = "Intel(R) Q45/Q43";         break;      case PCI_CHIP_G41_G:         chipset = "Intel(R) G41";         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. * * Extensions supported by all chips supported by i830_dri, i915_dri, or * i965_dri. */static 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_NV_point_sprite", GL_NV_point_sprite_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_crossbar", NULL},   {"GL_ARB_texture_env_dot3", NULL},   {"GL_ARB_texture_mirrored_repeat", NULL},   {"GL_ARB_texture_non_power_of_two",   NULL },   {"GL_ARB_texture_rectangle", NULL},   {"GL_NV_texture_rectangle", NULL},   {"GL_EXT_texture_rectangle", NULL},   {"GL_ARB_point_parameters", 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_logic_op", NULL},   {"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},   {"GL_ATI_separate_stencil", GL_ATI_separate_stencil_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}};static const struct dri_extension brw_extensions[] = {   { "GL_ARB_shading_language_100",       GL_VERSION_2_0_functions},   { "GL_ARB_shading_language_120",       GL_VERSION_2_1_functions},   { "GL_ARB_shader_objects",             GL_ARB_shader_objects_functions},   { "GL_ARB_vertex_shader",              GL_ARB_vertex_shader_functions},   { "GL_ARB_point_sprite", 		  NULL},   { "GL_ARB_fragment_shader",            NULL },   { "GL_ARB_draw_buffers",               NULL },   { "GL_ARB_depth_texture",              NULL },   { "GL_ARB_fragment_program",           NULL },   { "GL_ARB_shadow",                     NULL },   { "GL_EXT_shadow_funcs",               NULL },   { "GL_ARB_fragment_program_shadow",    NULL },   /* ARB extn won't work if not enabled */   { "GL_SGIX_depth_texture",             NULL },   { "GL_EXT_texture_sRGB",		  NULL},   { NULL,                                NULL }};static const struct dri_extension arb_oc_extensions[] = {   {"GL_ARB_occlusion_query",            GL_ARB_occlusion_query_functions},   {NULL, NULL}};static const struct dri_extension ttm_extensions[] = {   {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions},   {"GL_ARB_pixel_buffer_object", NULL},   {NULL, NULL}};/** * Initializes potential list of extensions if ctx == NULL, or actually enables * extensions for a context. */void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging){   struct intel_context *intel = ctx?intel_context(ctx):NULL;   /* Disable imaging extension until convolution is working in teximage paths.    */   enable_imaging = GL_FALSE;   driInitExtensions(ctx, card_extensions, enable_imaging);   if (intel == NULL || intel->ttm)      driInitExtensions(ctx, ttm_extensions, GL_FALSE);   if (intel == NULL ||        (IS_965(intel->intelScreen->deviceID) && 	intel->intelScreen->drmMinor >= 8))      driInitExtensions(ctx, arb_oc_extensions, GL_FALSE);   if (intel == NULL || IS_965(intel->intelScreen->deviceID))      driInitExtensions(ctx, brw_extensions, GL_FALSE);}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},   { "prim",  DEBUG_PRIMS },   { "vert",  DEBUG_VERTS },   { "dri",   DEBUG_DRI },   { "dma",   DEBUG_DMA },   { "san",   DEBUG_SANITY },   { "sleep", DEBUG_SLEEP },   { "stats", DEBUG_STATS },   { "tile",  DEBUG_TILE },   { "sing",  DEBUG_SINGLE_THREAD },   { "thre",  DEBUG_SINGLE_THREAD },   { "wm",    DEBUG_WM },   { "urb",   DEBUG_URB },   { "vs",    DEBUG_VS },   { NULL,    0 }};static voidintelInvalidateState(GLcontext * ctx, GLuint new_state){    struct intel_context *intel = intel_context(ctx);   _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->NewGLState |= new_state;   if (intel->vtbl.invalidate_state)      intel->vtbl.invalidate_state( intel, new_state );}voidintelFlush(GLcontext * ctx){   struct intel_context *intel = intel_context(ctx);   if (intel->Fallback)      _swrast_flush(ctx);   if (!IS_965(intel->intelScreen->deviceID))      INTEL_FIREVERTICES(intel);   if (intel->batch->map != intel->batch->ptr)      intel_batchbuffer_flush(intel->batch);   /* XXX: Need to do an MI_FLUSH here.    */}voidintelFinish(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;   }}static voidintelBeginQuery(GLcontext *ctx, GLenum target, struct gl_query_object *q){	struct intel_context *intel = intel_context( ctx );	struct drm_i915_mmio io = {		.read_write = I915_MMIO_READ,		.reg = MMIO_REGS_PS_DEPTH_COUNT,		.data = &q->Result 	};	intel->stats_wm++;	intelFinish(&intel->ctx);	drmCommandWrite(intel->driFd, DRM_I915_MMIO, &io, sizeof(io));}static voidintelEndQuery(GLcontext *ctx, GLenum target, struct gl_query_object *q){	struct intel_context *intel = intel_context( ctx );	GLuint64EXT tmp;		struct drm_i915_mmio io = {		.read_write = I915_MMIO_READ,		.reg = MMIO_REGS_PS_DEPTH_COUNT,		.data = &tmp	};	intelFinish(&intel->ctx);	drmCommandWrite(intel->driFd, DRM_I915_MMIO, &io, sizeof(io));	q->Result = tmp - q->Result;	q->Ready = GL_TRUE;	intel->stats_wm--;}/** Driver-specific fence emit implementation for the fake memory manager. */static unsigned intintel_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 intintel_fence_wait(void *private, unsigned int cookie){   struct intel_context *intel = (struct intel_context *)private;   intelWaitIrq(intel, cookie);   return 0;}static GLbooleanintel_init_bufmgr(struct intel_context *intel){   intelScreenPrivate *intelScreen = intel->intelScreen;   GLboolean ttm_disable = getenv("INTEL_NO_TTM") != NULL;   GLboolean ttm_supported;   /* 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 (intel->intelScreen->driScrnPriv->dri2.enabled)       ttm_supported = GL_TRUE;   else if (intel->intelScreen->driScrnPriv->ddx_version.minor >= 9 &&	    intel->intelScreen->drmMinor >= 11 &&	    intel->intelScreen->front.bo_handle != -1)       ttm_supported = GL_TRUE;   else       ttm_supported = GL_FALSE;   if (!ttm_disable && ttm_supported) {      int bo_reuse_mode;      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;      bo_reuse_mode = driQueryOptioni(&intel->optionCache, "bo_reuse");      switch (bo_reuse_mode) {      case DRI_CONF_BO_REUSE_DISABLED:	 break;      case DRI_CONF_BO_REUSE_ALL:	 intel_ttm_enable_bo_reuse(intel->bufmgr);	 break;      }   }   /* 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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -