static void viaTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *packing, struct gl_texture_object *texObj, struct gl_texture_image *texImage) { viaContextPtr vmesa = VIA_CONTEXT(ctx); viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData; if (t) { viaSwapOutTexObj(VIA_CONTEXT(ctx), t); } _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, height, format, type, pixels, packing, texObj, texImage); if(vmesa->shareCtx) vmesa->shareCtx->NewState |= _NEW_TEXTURE; }
static GLboolean via_run_fastrender(GLcontext *ctx, struct tnl_pipeline_stage *stage) { struct via_context *vmesa = VIA_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; GLuint i; tnl->Driver.Render.Start(ctx); if (VB->ClipOrMask || vmesa->renderIndex != 0 || !via_fastvalidate_render( ctx, VB )) { tnl->Driver.Render.Finish(ctx); return GL_TRUE; } tnl->clipspace.new_inputs |= VERT_BIT_POS; for (i = 0; i < VB->PrimitiveCount; ++i) { GLuint mode = _tnl_translate_prim(&VB->Primitive[i]); GLuint start = VB->Primitive[i].start; GLuint length = VB->Primitive[i].count; if (length) via_fastrender_tab_verts[mode & PRIM_MODE_MASK](ctx, start, start+length, mode); } tnl->Driver.Render.Finish(ctx); return GL_FALSE; /* finished the pipe */ }
static void viaTexImage1D(GLcontext *ctx, GLenum target, GLint level, GLint internalFormat, GLint width, GLint border, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *packing, struct gl_texture_object *texObj, struct gl_texture_image *texImage) { viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData; if (VIA_DEBUG) fprintf(stderr, "viaTexImage1D - in\n"); if (t) { if (level == 0) { viaSwapOutTexObj(VIA_CONTEXT(ctx), t); t->actualLevel = 0; } else t->actualLevel++; } else { t = viaAllocTextureObject(texObj); if (!t) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "viaTexImage1D"); return; } texObj->DriverData = t; } _mesa_store_teximage1d(ctx, target, level, internalFormat, width, border, format, type, pixels, packing, texObj, texImage); if (VIA_DEBUG) fprintf(stderr, "viaTexImage1D - out\n"); }
static void viaSetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit) { struct via_context *vmesa = VIA_CONTEXT(ctx); if (bufferBit == BUFFER_BIT_FRONT_LEFT) { vmesa->drawBuffer = vmesa->readBuffer = &vmesa->front; } else if (bufferBit == BUFFER_BIT_BACK_LEFT) { vmesa->drawBuffer = vmesa->readBuffer = &vmesa->back; } else { ASSERT(0); } }
static void viaFastRenderClippedPoly(struct gl_context *ctx, const GLuint *elts, GLuint n) { struct via_context *vmesa = VIA_CONTEXT(ctx); GLuint vertsize = vmesa->vertexSize; GLuint *vb = viaExtendPrimitive(vmesa, (n - 2) * 3 * 4 * vertsize); GLubyte *vertptr = (GLubyte *)vmesa->verts; const GLuint *start = (const GLuint *)V(elts[0]); int i; for (i = 2; i < n; i++) { COPY_DWORDS(vb, vertsize, V(elts[i - 1])); COPY_DWORDS(vb, vertsize, V(elts[i])); COPY_DWORDS(vb, vertsize, start); } }
static void viaDeleteTexture(GLcontext *ctx, struct gl_texture_object *texObj) { viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData; if (VIA_DEBUG) fprintf(stderr, "viaDeleteTexture - in\n"); if (t) { viaContextPtr vmesa = VIA_CONTEXT(ctx); if (vmesa) { if (vmesa->dma) { /* imply vmesa is not under destroying */ VIA_FLUSH_DMA(vmesa); } viaDestroyTexObj(vmesa, t); } texObj->DriverData = 0; } if (VIA_DEBUG) fprintf(stderr, "viaDeleteTexture - out\n"); /* Free mipmap images and the texture object itself */ _mesa_delete_texture_object(ctx, texObj); }
static void viaTexSubImage1D(GLcontext *ctx, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *packing, struct gl_texture_object *texObj, struct gl_texture_image *texImage) { viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData; if (t) { viaSwapOutTexObj(VIA_CONTEXT(ctx), t); } _mesa_store_texsubimage1d(ctx, target, level, xoffset, width, format, type, pixels, packing, texObj, texImage); }
static void viaRenderClippedPoly(struct gl_context *ctx, const GLuint *elts, GLuint n) { TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; GLuint prim = VIA_CONTEXT(ctx)->renderPrimitive; /* Render the new vertices as an unclipped polygon. */ { GLuint *tmp = VB->Elts; VB->Elts = (GLuint *)elts; tnl->Driver.Render.PrimTabElts[GL_POLYGON](ctx, 0, n, PRIM_BEGIN|PRIM_END); VB->Elts = tmp; } /* Restore the render primitive */ if (prim != GL_POLYGON && prim != GL_POLYGON + 1) tnl->Driver.Render.PrimitiveNotify( ctx, prim ); }
void viaSpanRenderFinish( GLcontext *ctx ) { struct via_context *vmesa = VIA_CONTEXT(ctx); _swrast_flush( ctx ); UNLOCK_HARDWARE( vmesa ); }
/* Move locking out to get reasonable span performance. */ void viaSpanRenderStart( GLcontext *ctx ) { struct via_context *vmesa = VIA_CONTEXT(ctx); viaWaitIdle(vmesa, GL_FALSE); LOCK_HARDWARE(vmesa); }
static void viaChooseVertexState( struct gl_context *ctx ) { struct via_context *vmesa = VIA_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); DECLARE_RENDERINPUTS(index_bitset); GLuint regCmdB = HC_HVPMSK_X | HC_HVPMSK_Y | HC_HVPMSK_Z; GLuint setupIndex = 0; RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset ); vmesa->vertex_attr_count = 0; /* EMIT_ATTR's must be in order as they tell t_vertex.c how to * build up a hardware vertex. */ if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX ) || RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) { EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, VIA_EMIT_W, HC_HVPMSK_W ); vmesa->coloroffset = 4; } else { EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0, 0 ); vmesa->coloroffset = 3; } /* t_context.c always includes a diffuse color */ EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, VIA_EMIT_RGBA, HC_HVPMSK_Cd ); vmesa->specoffset = 0; if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 ) || RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) { if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) { vmesa->specoffset = vmesa->coloroffset + 1; EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, VIA_EMIT_SPEC, HC_HVPMSK_Cs ); } else EMIT_PAD( 3 ); if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, VIA_EMIT_FOG, HC_HVPMSK_Cs ); else EMIT_PAD( 1 ); } if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 )) { if (vmesa->ptexHack) EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_3F_XYW, VIA_EMIT_PTEX0, (HC_HVPMSK_S | HC_HVPMSK_T) ); else EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, VIA_EMIT_TEX0, (HC_HVPMSK_S | HC_HVPMSK_T) ); } if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 )) { EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, VIA_EMIT_TEX1, (HC_HVPMSK_S | HC_HVPMSK_T) ); } if (setupIndex != vmesa->setupIndex) { vmesa->vertexSize = _tnl_install_attrs( ctx, vmesa->vertex_attrs, vmesa->vertex_attr_count, vmesa->ViewportMatrix.m, 0 ); vmesa->vertexSize >>= 2; vmesa->setupIndex = setupIndex; vmesa->regCmdB &= ~HC_HVPMSK_MASK; vmesa->regCmdB |= regCmdB; if (vmesa->ptexHack) vmesa->hwVertexSize = vmesa->vertexSize - 1; else vmesa->hwVertexSize = vmesa->vertexSize; }
static void viaChooseRenderState(struct gl_context *ctx) { TNLcontext *tnl = TNL_CONTEXT(ctx); struct via_context *vmesa = VIA_CONTEXT(ctx); GLuint flags = ctx->_TriangleCaps; GLuint index = 0; if (vmesa->ptexHack) { vmesa->drawPoint = via_ptex_point; vmesa->drawLine = via_ptex_line; vmesa->drawTri = via_ptex_tri; index |= VIA_FALLBACK_BIT; } else { vmesa->drawPoint = via_draw_point; vmesa->drawLine = via_draw_line; vmesa->drawTri = via_draw_triangle; } if (flags & (ANY_FALLBACK_FLAGS | ANY_RASTER_FLAGS)) { if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) index |= VIA_TWOSIDE_BIT; if (ctx->Polygon.FrontMode != GL_FILL || ctx->Polygon.BackMode != GL_FILL) index |= VIA_UNFILLED_BIT; if (flags & DD_TRI_OFFSET) index |= VIA_OFFSET_BIT; if (flags & ANY_FALLBACK_FLAGS) index |= VIA_FALLBACK_BIT; /* Hook in fallbacks for specific primitives. */ if (flags & POINT_FALLBACK) vmesa->drawPoint = via_fallback_point; if (flags & LINE_FALLBACK) vmesa->drawLine = via_fallback_line; if (flags & TRI_FALLBACK) vmesa->drawTri = via_fallback_tri; } if ((flags & DD_SEPARATE_SPECULAR) && ctx->Light.ShadeModel == GL_FLAT) index = VIA_MAX_TRIFUNC; /* flat specular */ if (vmesa->renderIndex != index) { vmesa->renderIndex = index; tnl->Driver.Render.Points = rast_tab[index].points; tnl->Driver.Render.Line = rast_tab[index].line; tnl->Driver.Render.Triangle = rast_tab[index].triangle; tnl->Driver.Render.Quad = rast_tab[index].quad; if (index == 0) { tnl->Driver.Render.PrimTabVerts = via_render_tab_verts; tnl->Driver.Render.PrimTabElts = via_render_tab_elts; tnl->Driver.Render.ClippedLine = line; /* from tritmp.h */ tnl->Driver.Render.ClippedPolygon = viaFastRenderClippedPoly; } else { tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; tnl->Driver.Render.ClippedLine = viaRenderClippedLine; tnl->Driver.Render.ClippedPolygon = viaRenderClippedPoly; } } }
static void viaResetLineStipple( struct gl_context *ctx ) { struct via_context *vmesa = VIA_CONTEXT(ctx); vmesa->regCmdB |= HC_HLPrst_MASK; }
static void viaTexEnv(GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *param) { viaContextPtr vmesa = VIA_CONTEXT(ctx); vmesa = vmesa; }
static const struct gl_texture_format * viaChooseTexFormat(GLcontext *ctx, GLint internalFormat, GLenum format, GLenum type) { viaContextPtr vmesa = VIA_CONTEXT(ctx); (void)format; (void)type; if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); if (VIA_DEBUG) fprintf(stderr, "internalFormat:%d format:%d\n", internalFormat, format); switch (internalFormat) { case 1: case GL_LUMINANCE: case GL_LUMINANCE4: case GL_LUMINANCE8: case GL_LUMINANCE12: case GL_LUMINANCE16: return &_mesa_texformat_l8; case 2: case GL_LUMINANCE_ALPHA: case GL_LUMINANCE4_ALPHA4: case GL_LUMINANCE6_ALPHA2: case GL_LUMINANCE8_ALPHA8: case GL_LUMINANCE12_ALPHA4: case GL_LUMINANCE12_ALPHA12: case GL_LUMINANCE16_ALPHA16: return &_mesa_texformat_al88; case GL_R3_G3_B2: case GL_RGB4: case GL_RGB5: if (VIA_DEBUG) fprintf(stderr, "2 &_mesa_texformat_arg565\n"); return &_mesa_texformat_rgb565; case 3: case GL_RGB: case GL_RGB8: case GL_RGB10: case GL_RGB12: case GL_RGB16: if (vmesa->viaScreen->bitsPerPixel == 0x20) { if (VIA_DEBUG) fprintf(stderr,"3 argb8888\n"); return &_mesa_texformat_argb8888; } else { if (VIA_DEBUG) fprintf(stderr,"3 rgb565\n"); return &_mesa_texformat_rgb565; } case 4: if (vmesa->viaScreen->bitsPerPixel == 0x20) { if (VIA_DEBUG) fprintf(stderr, "4 &_mesa_texformat_argb8888\n"); return &_mesa_texformat_argb8888; } else { if (VIA_DEBUG) fprintf(stderr, "4 &_mesa_texformat_argb4444\n"); return &_mesa_texformat_argb4444; } case GL_RGBA2: case GL_RGBA4: if (VIA_DEBUG) fprintf(stderr, "GL_RGBA4 &_mesa_texformat_argb4444\n"); return &_mesa_texformat_argb4444; case GL_RGB5_A1: if (VIA_DEBUG) fprintf(stderr, "GL_RGB5_A1 &_mesa_texformat_argb1555\n"); return &_mesa_texformat_argb1555; case GL_RGBA: case GL_RGBA8: case GL_RGBA12: case GL_RGBA16: case GL_RGB10_A2: if (VIA_DEBUG) fprintf(stderr, "GL_RGBA &_mesa_texformat_argb8888\n"); return &_mesa_texformat_argb8888; case GL_ALPHA: case GL_ALPHA4: case GL_ALPHA8: case GL_ALPHA12: case GL_ALPHA16: return &_mesa_texformat_a8; case GL_INTENSITY: case GL_INTENSITY4: case GL_INTENSITY8: case GL_INTENSITY12: case GL_INTENSITY16: return &_mesa_texformat_i8; case GL_COLOR_INDEX: case GL_COLOR_INDEX1_EXT: case GL_COLOR_INDEX2_EXT: case GL_COLOR_INDEX4_EXT: case GL_COLOR_INDEX8_EXT: case GL_COLOR_INDEX12_EXT: case GL_COLOR_INDEX16_EXT: return &_mesa_texformat_ci8; default: _mesa_problem(ctx, "unexpected format in viaChooseTextureFormat"); return NULL; } }
void viaInitSpanFuncs(GLcontext *ctx) { #if 0 struct via_context *vmesa = VIA_CONTEXT(ctx); #endif struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx); swdd->SetBuffer = viaSetBuffer; #if 0 if (vmesa->viaScreen->bitsPerPixel == 16) { viaInitPointers_565( swdd ); } else if (vmesa->viaScreen->bitsPerPixel == 32) { viaInitPointers_8888( swdd ); } else { assert(0); } #endif #if 0 if (vmesa->glCtx->Visual.depthBits == 16) { swdd->ReadDepthSpan = viaReadDepthSpan_16; swdd->WriteDepthSpan = viaWriteDepthSpan_16; swdd->WriteMonoDepthSpan = viaWriteMonoDepthSpan_16; swdd->ReadDepthPixels = viaReadDepthPixels_16; swdd->WriteDepthPixels = viaWriteDepthPixels_16; } else if (vmesa->glCtx->Visual.depthBits == 24) { swdd->ReadDepthSpan = viaReadDepthSpan_24_8; swdd->WriteDepthSpan = viaWriteDepthSpan_24_8; swdd->WriteMonoDepthSpan = viaWriteMonoDepthSpan_24_8; swdd->ReadDepthPixels = viaReadDepthPixels_24_8; swdd->WriteDepthPixels = viaWriteDepthPixels_24_8; swdd->WriteStencilSpan = viaWriteStencilSpan_24_8; swdd->ReadStencilSpan = viaReadStencilSpan_24_8; swdd->WriteStencilPixels = viaWriteStencilPixels_24_8; swdd->ReadStencilPixels = viaReadStencilPixels_24_8; } else if (vmesa->glCtx->Visual.depthBits == 32) { swdd->ReadDepthSpan = viaReadDepthSpan_32; swdd->WriteDepthSpan = viaWriteDepthSpan_32; swdd->WriteMonoDepthSpan = viaWriteMonoDepthSpan_32; swdd->ReadDepthPixels = viaReadDepthPixels_32; swdd->WriteDepthPixels = viaWriteDepthPixels_32; } #endif swdd->SpanRenderStart = viaSpanRenderStart; swdd->SpanRenderFinish = viaSpanRenderFinish; #if 0 swdd->WriteCI8Span = NULL; swdd->WriteCI32Span = NULL; swdd->WriteMonoCISpan = NULL; swdd->WriteCI32Pixels = NULL; swdd->WriteMonoCIPixels = NULL; swdd->ReadCI32Span = NULL; swdd->ReadCI32Pixels = NULL; #endif }