📄 intel_context.c
字号:
/************************************************************************** * * 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 + -