/* This version of AllocateMemoryMESA allocates only agp memory, and * only does so after the point at which the driver has been * initialized. * * Theoretically a valid context isn't required. However, in this * implementation, it is, as I'm using the hardware lock to protect * the kernel data structures, and the current context to get the * device fd. */ void *intelAllocateMemoryMESA(__DRInativeDisplay *dpy, int scrn, GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority) { GET_CURRENT_CONTEXT(ctx); if (INTEL_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s sz %d %f/%f/%f\n", __FUNCTION__, size, readfreq, writefreq, priority); if (getenv("INTEL_NO_ALLOC")) return NULL; if (!ctx || INTEL_CONTEXT(ctx) == 0) return NULL; return intelAllocateAGP( INTEL_CONTEXT(ctx), size ); }
void intelInitBatchBuffer( GLcontext *ctx ) { intelContextPtr intel = INTEL_CONTEXT(ctx); if (!intel->intelScreen->allow_batchbuffer || getenv("INTEL_NO_BATCH")) { intel->alloc.size = 8 * 1024; intel->alloc.ptr = malloc( intel->alloc.size ); intel->alloc.offset = 0; } else { switch (intel->intelScreen->deviceID) { case PCI_CHIP_I865_G: /* HW bug? Seems to crash if batchbuffer crosses 4k boundary. */ intel->alloc.size = 8 * 1024; break; default: /* This is the smallest amount of memory the kernel deals with. * We'd ideally like to make this smaller. */ intel->alloc.size = 1 << intel->intelScreen->logTextureGranularity; break; } intel->alloc.ptr = intelAllocateAGP( intel, intel->alloc.size ); if (intel->alloc.ptr) intel->alloc.offset = intelAgpOffsetFromVirtual( intel, intel->alloc.ptr ); } if (!intel->alloc.ptr) { FALLBACK(intel, INTEL_FALLBACK_NO_BATCHBUFFER, 1); } else { intel->prim.flush = 0; intel->vtbl.emit_invarient_state( intel ); /* Make sure this gets to the hardware, even if we have no cliprects: */ LOCK_HARDWARE( intel ); intelFlushBatchLocked( intel, GL_TRUE, GL_FALSE, GL_TRUE ); UNLOCK_HARDWARE( intel ); } }