r300: General render clean up; added some Doxygen documentation, too.

This commit is contained in:
Oliver McFadden
2007-05-08 19:22:15 +00:00
parent fbeae4f70c
commit 313c4c2643
+47 -52
View File
@@ -26,8 +26,20 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
/*
* Authors:
* Nicolai Haehnle <prefect_@gmx.net>
* \file
*
* \brief R300 Render (Vertex Buffer Implementation)
*
* The immediate implementation has been removed from CVS in favor of the vertex
* buffer implementation.
*
* When falling back to software TCL still attempt to use hardware
* rasterization.
*
* I am not sure that the cache related registers are setup correctly, but
* obviously this does work... Further investigation is needed.
*
* \author Nicolai Haehnle <prefect_@gmx.net>
*/
#include "glheader.h"
@@ -61,14 +73,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
extern int future_hw_tcl_on;
/**********************************************************************
* Hardware rasterization
*
* When we fell back to software TCL, we still try to use the
* rasterization hardware for rendering.
**********************************************************************/
static int r300_get_primitive_type(r300ContextPtr rmesa, GLcontext *ctx, int prim)
static int r300PrimitiveType(r300ContextPtr rmesa, GLcontext *ctx, int prim)
{
int type=-1;
@@ -113,7 +118,7 @@ static int r300_get_primitive_type(r300ContextPtr rmesa, GLcontext *ctx, int pri
return type;
}
int r300_get_num_verts(r300ContextPtr rmesa, int num_verts, int prim)
static int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim)
{
int verts_off=0;
@@ -180,11 +185,7 @@ int r300_get_num_verts(r300ContextPtr rmesa, int num_verts, int prim)
return num_verts - verts_off;
}
/* Immediate implementation has been removed from CVS. */
/* vertex buffer implementation */
static void inline fire_EB(r300ContextPtr rmesa, unsigned long addr, int vertex_count, int type, int elt_size)
static void inline r300FireEB(r300ContextPtr rmesa, unsigned long addr, int vertex_count, int type, int elt_size)
{
int cmd_reserved = 0;
int cmd_written = 0;
@@ -239,7 +240,7 @@ static void inline fire_EB(r300ContextPtr rmesa, unsigned long addr, int vertex_
}
}
static void r300_render_vb_primitive(r300ContextPtr rmesa,
static void r300RunRenderPrimitive(r300ContextPtr rmesa,
GLcontext *ctx,
int start,
int end,
@@ -247,8 +248,8 @@ static void r300_render_vb_primitive(r300ContextPtr rmesa,
{
int type, num_verts;
type=r300_get_primitive_type(rmesa, ctx, prim);
num_verts=r300_get_num_verts(rmesa, end-start, prim);
type=r300PrimitiveType(rmesa, ctx, prim);
num_verts=r300NumVerts(rmesa, end-start, prim);
if(type<0 || num_verts <= 0)return;
@@ -259,14 +260,14 @@ static void r300_render_vb_primitive(r300ContextPtr rmesa,
return;
}
r300EmitElts(ctx, rmesa->state.VB.Elts, num_verts, rmesa->state.VB.elt_size);
fire_EB(rmesa, rmesa->state.elt_dma.aos_offset, num_verts, type, rmesa->state.VB.elt_size);
r300FireEB(rmesa, rmesa->state.elt_dma.aos_offset, num_verts, type, rmesa->state.VB.elt_size);
}else{
r300EmitAOS(rmesa, rmesa->state.aos_count, start);
fire_AOS(rmesa, num_verts, type);
}
}
GLboolean r300_run_vb_render(GLcontext *ctx,
static GLboolean r300RunRender(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
@@ -304,7 +305,7 @@ GLboolean r300_run_vb_render(GLcontext *ctx,
GLuint start = VB->Primitive[i].start;
GLuint length = VB->Primitive[i].count;
r300_render_vb_primitive(rmesa, ctx, start, start + length, prim);
r300RunRenderPrimitive(rmesa, ctx, start, start + length, prim);
}
reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0);
@@ -333,20 +334,16 @@ GLboolean r300_run_vb_render(GLcontext *ctx,
int r300Fallback(GLcontext *ctx)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
struct r300_fragment_program *rp =
struct r300_fragment_program *fp =
(struct r300_fragment_program *)
(char *)ctx->FragmentProgram._Current;
if (rp) {
if (!rp->translated)
r300_translate_fragment_shader(r300, rp);
FALLBACK_IF(!rp->translated);
if (fp) {
if (!fp->translated)
r300_translate_fragment_shader(r300, fp);
FALLBACK_IF(!fp->translated);
}
/* We do not do SELECT or FEEDBACK (yet ?)
* Is it worth doing them ?
*/
FALLBACK_IF(ctx->RenderMode != GL_RENDER);
FALLBACK_IF(ctx->Stencil._TestTwoSide &&
@@ -354,6 +351,14 @@ int r300Fallback(GLcontext *ctx)
ctx->Stencil.ValueMask[0] != ctx->Stencil.ValueMask[1] ||
ctx->Stencil.WriteMask[0] != ctx->Stencil.WriteMask[1]));
/* GL_COLOR_LOGIC_OP */
FALLBACK_IF(ctx->Color.ColorLogicOpEnabled);
/* GL_POINT_SPRITE_ARB, GL_POINT_SPRITE_NV */
if (ctx->Extensions.NV_point_sprite ||
ctx->Extensions.ARB_point_sprite)
FALLBACK_IF(ctx->Point.PointSprite);
if(!r300->disable_lowimpact_fallback){
/* GL_POLYGON_OFFSET_POINT */
FALLBACK_IF(ctx->Polygon.OffsetPoint);
@@ -361,9 +366,9 @@ int r300Fallback(GLcontext *ctx)
FALLBACK_IF(ctx->Polygon.OffsetLine);
/* GL_POLYGON_STIPPLE */
FALLBACK_IF(ctx->Polygon.StippleFlag);
/* GL_MULTISAMPLE_ARB */
/* GL_MULTISAMPLE */
FALLBACK_IF(ctx->Multisample.Enabled);
/* blender ? */
/* GL_LINE_STIPPLE */
FALLBACK_IF(ctx->Line.StippleFlag);
/* GL_LINE_SMOOTH */
FALLBACK_IF(ctx->Line.SmoothFlag);
@@ -371,15 +376,6 @@ int r300Fallback(GLcontext *ctx)
FALLBACK_IF(ctx->Point.SmoothFlag);
}
/* Fallback for LOGICOP */
FALLBACK_IF(ctx->Color.ColorLogicOpEnabled);
/* Rest could be done with vertex fragments */
if (ctx->Extensions.NV_point_sprite ||
ctx->Extensions.ARB_point_sprite)
/* GL_POINT_SPRITE_NV */
FALLBACK_IF(ctx->Point.PointSprite);
return R300_FALLBACK_NONE;
}
@@ -389,7 +385,7 @@ int r300Fallback(GLcontext *ctx)
* rasterization) or false to indicate that the pipeline has finished
* after we render something.
*/
static GLboolean r300_run_render(GLcontext *ctx,
static GLboolean r300RunNonTNLRender(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
if (RADEON_DEBUG & DEBUG_PRIMS)
@@ -398,10 +394,10 @@ static GLboolean r300_run_render(GLcontext *ctx,
if (r300Fallback(ctx) >= R300_FALLBACK_RAST)
return GL_TRUE;
return r300_run_vb_render(ctx, stage);
return r300RunRender(ctx, stage);
}
static GLboolean r300_run_tcl_render(GLcontext *ctx,
static GLboolean r300RunTCLRender(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
@@ -411,6 +407,7 @@ static GLboolean r300_run_tcl_render(GLcontext *ctx,
if (RADEON_DEBUG & DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
if(hw_tcl_on == GL_FALSE)
return GL_TRUE;
@@ -427,25 +424,23 @@ static GLboolean r300_run_tcl_render(GLcontext *ctx,
return GL_TRUE;
}
//r300UpdateShaderStates(rmesa);
return r300_run_vb_render(ctx, stage);
return r300RunRender(ctx, stage);
}
const struct tnl_pipeline_stage _r300_render_stage = {
"r300 hw rasterize",
"r300 Hardware Rasterization",
NULL,
NULL,
NULL,
NULL,
r300_run_render /* run */
r300RunNonTNLRender
};
const struct tnl_pipeline_stage _r300_tcl_stage = {
"r300 tcl",
"r300 Hardware Transform, Clipping and Lighting",
NULL,
NULL,
NULL,
NULL,
r300_run_tcl_render /* run */
r300RunTCLRender
};