2 * Copyright (C) 2008-2009 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 * Richard Li <RichardZ.Li@amd.com>, <richardradeon@gmail.com>
27 #include "main/glheader.h"
28 #include "main/mtypes.h"
29 #include "main/state.h"
30 #include "main/imports.h"
31 #include "main/enums.h"
32 #include "main/macros.h"
34 #include "main/simple_list.h"
37 #include "tnl/t_pipeline.h"
38 #include "tnl/t_vp_build.h"
39 #include "swrast/swrast.h"
40 #include "swrast_setup/swrast_setup.h"
41 #include "main/api_arrayelt.h"
42 #include "main/state.h"
43 #include "main/framebuffer.h"
45 #include "shader/prog_parameter.h"
46 #include "shader/prog_statevars.h"
48 #include "main/texformat.h"
50 #include "r600_context.h"
52 #include "r700_chip.h"
53 #include "r700_state.h"
55 #include "r700_fragprog.h"
56 #include "r700_vertprog.h"
59 void r700SetDefaultStates(context_t
*context
) //--------------------
64 void r700UpdateShaders (GLcontext
* ctx
) //----------------------------------
66 context_t
*context
= R700_CONTEXT(ctx
);
68 GLvector4f dummy_attrib
[_TNL_ATTRIB_MAX
];
69 GLvector4f
*temp_attrib
[_TNL_ATTRIB_MAX
];
71 struct r700_vertex_program
*vp
;
74 if (context
->radeon
.NewGLState
)
76 context
->radeon
.NewGLState
= 0;
78 for (i
= _TNL_FIRST_MAT
; i
<= _TNL_LAST_MAT
; i
++)
80 /* mat states from state var not array for sw */
81 dummy_attrib
[i
].stride
= 0;
83 temp_attrib
[i
] = TNL_CONTEXT(ctx
)->vb
.AttribPtr
[i
];
84 TNL_CONTEXT(ctx
)->vb
.AttribPtr
[i
] = &(dummy_attrib
[i
]);
87 _tnl_UpdateFixedFunctionProgram(ctx
);
89 for (i
= _TNL_FIRST_MAT
; i
<= _TNL_LAST_MAT
; i
++)
91 TNL_CONTEXT(ctx
)->vb
.AttribPtr
[i
] = temp_attrib
[i
];
94 r700SelectVertexShader(ctx
);
95 vp
= (struct r700_vertex_program
*)ctx
->VertexProgram
._Current
;
97 if (vp
->translated
== GL_FALSE
)
100 //fprintf(stderr, "Failing back to sw-tcl\n");
101 //hw_tcl_on = future_hw_tcl_on = 0;
102 //r300ResetHwState(rmesa);
104 r700UpdateStateParameters(ctx
, _NEW_PROGRAM
);
109 r700UpdateStateParameters(ctx
, _NEW_PROGRAM
);
113 * To correctly position primitives:
115 void r700UpdateViewportOffset(GLcontext
* ctx
) //------------------
121 * Tell the card where to render (offset, pitch).
122 * Effected by glDrawBuffer, etc
124 void r700UpdateDrawBuffer(GLcontext
* ctx
) /* TODO */ //---------------------
126 #if 0 /* to be enabled */
127 context_t
*context
= R700_CONTEXT(ctx
);
129 switch (ctx
->DrawBuffer
->_ColorDrawBufferIndexes
[0])
131 case BUFFER_FRONT_LEFT
:
132 context
->target
.rt
= context
->screen
->frontBuffer
;
134 case BUFFER_BACK_LEFT
:
135 context
->target
.rt
= context
->screen
->backBuffer
;
138 memset (&context
->target
.rt
, sizeof(context
->target
.rt
), 0);
140 #endif /* to be enabled */
143 static void r700FetchStateParameter(GLcontext
* ctx
,
144 const gl_state_index state
[STATE_LENGTH
],
147 context_t
*context
= R700_CONTEXT(ctx
);
152 void r700UpdateStateParameters(GLcontext
* ctx
, GLuint new_state
) //--------------------
154 struct r700_fragment_program
*fp
;
155 struct gl_program_parameter_list
*paramList
;
158 if (!(new_state
& (_NEW_BUFFERS
| _NEW_PROGRAM
)))
161 fp
= (struct r700_fragment_program
*)ctx
->FragmentProgram
._Current
;
167 paramList
= fp
->mesa_program
.Base
.Parameters
;
174 for (i
= 0; i
< paramList
->NumParameters
; i
++)
176 if (paramList
->Parameters
[i
].Type
== PROGRAM_STATE_VAR
)
178 r700FetchStateParameter(ctx
,
179 paramList
->Parameters
[i
].
181 paramList
->ParameterValues
[i
]);
187 * Called by Mesa after an internal state update.
189 static void r700InvalidateState(GLcontext
* ctx
, GLuint new_state
) //-------------------
191 context_t
*context
= R700_CONTEXT(ctx
);
193 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(context
->chipobj
.pvChipObj
);
195 _swrast_InvalidateState(ctx
, new_state
);
196 _swsetup_InvalidateState(ctx
, new_state
);
197 _vbo_InvalidateState(ctx
, new_state
);
198 _tnl_InvalidateState(ctx
, new_state
);
199 _ae_invalidate_state(ctx
, new_state
);
201 if (new_state
& (_NEW_BUFFERS
| _NEW_COLOR
| _NEW_PIXEL
))
203 _mesa_update_framebuffer(ctx
);
204 /* this updates the DrawBuffer's Width/Height if it's a FBO */
205 _mesa_update_draw_buffer_bounds(ctx
);
207 r700UpdateDrawBuffer(ctx
);
210 r700UpdateStateParameters(ctx
, new_state
);
212 if(GL_TRUE
== r700
->bEnablePerspective
)
214 /* Do scale XY and Z by 1/W0 for perspective correction on pos. For orthogonal case, set both to one. */
215 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_XY_FMT_bit
);
216 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_Z_FMT_bit
);
218 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_W0_FMT_bit
);
220 CLEARbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, PERSP_GRADIENT_ENA_bit
);
221 SETbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, LINEAR_GRADIENT_ENA_bit
);
225 /* For orthogonal case. */
226 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_XY_FMT_bit
);
227 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_Z_FMT_bit
);
229 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_W0_FMT_bit
);
231 SETbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, PERSP_GRADIENT_ENA_bit
);
232 CLEARbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, LINEAR_GRADIENT_ENA_bit
);
235 context
->radeon
.NewGLState
|= new_state
;
238 static void r700SetDepthState(GLcontext
* ctx
)
240 context_t
*context
= R700_CONTEXT(ctx
);
242 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(context
->chipobj
.pvChipObj
);
246 SETbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_ENABLE_bit
);
249 SETbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_WRITE_ENABLE_bit
);
253 CLEARbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_WRITE_ENABLE_bit
);
256 switch (ctx
->Depth
.Func
)
259 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_NEVER
,
260 ZFUNC_shift
, ZFUNC_mask
);
263 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_LESS
,
264 ZFUNC_shift
, ZFUNC_mask
);
267 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_EQUAL
,
268 ZFUNC_shift
, ZFUNC_mask
);
271 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_LEQUAL
,
272 ZFUNC_shift
, ZFUNC_mask
);
275 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_GREATER
,
276 ZFUNC_shift
, ZFUNC_mask
);
279 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_NOTEQUAL
,
280 ZFUNC_shift
, ZFUNC_mask
);
283 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_GEQUAL
,
284 ZFUNC_shift
, ZFUNC_mask
);
287 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_ALWAYS
,
288 ZFUNC_shift
, ZFUNC_mask
);
291 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_ALWAYS
,
292 ZFUNC_shift
, ZFUNC_mask
);
298 CLEARbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_ENABLE_bit
);
299 CLEARbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_WRITE_ENABLE_bit
);
303 static void r700AlphaFunc(GLcontext
* ctx
, GLenum func
, GLfloat ref
) //---------------
308 static void r700BlendColor(GLcontext
* ctx
, const GLfloat cf
[4]) //----------------
312 static void r700BlendEquationSeparate(GLcontext
* ctx
,
313 GLenum modeRGB
, GLenum modeA
) //-----------------
317 static void r700BlendFuncSeparate(GLcontext
* ctx
,
318 GLenum sfactorRGB
, GLenum dfactorRGB
,
319 GLenum sfactorA
, GLenum dfactorA
) //------------------------
323 static void r700UpdateCulling(GLcontext
* ctx
)
325 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(R700_CONTEXT(ctx
)->chipobj
.pvChipObj
);
327 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
);
328 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
329 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
331 if (ctx
->Polygon
.CullFlag
)
333 switch (ctx
->Polygon
.CullFaceMode
)
336 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
337 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
340 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
341 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
343 case GL_FRONT_AND_BACK
:
344 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
345 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
348 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
349 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
354 switch (ctx
->Polygon
.FrontFace
)
357 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
);
360 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
);
363 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
); /* default: ccw */
368 static void r700Enable(GLcontext
* ctx
, GLenum cap
, GLboolean state
) //------------------
380 case GL_COLOR_LOGIC_OP
:
391 r700SetDepthState(ctx
);
393 case GL_STENCIL_TEST
:
396 r700UpdateCulling(ctx
);
398 case GL_POLYGON_OFFSET_POINT
:
399 case GL_POLYGON_OFFSET_LINE
:
400 case GL_POLYGON_OFFSET_FILL
:
408 * Handle glColorMask()
410 static void r700ColorMask(GLcontext
* ctx
,
411 GLboolean r
, GLboolean g
, GLboolean b
, GLboolean a
) //------------------
416 * Change the depth testing function.
418 * \note Mesa already filters redundant calls to this function.
420 static void r700DepthFunc(GLcontext
* ctx
, GLenum func
) //--------------------
422 r700SetDepthState(ctx
);
426 * Enable/Disable depth writing.
428 * \note Mesa already filters redundant calls to this function.
430 static void r700DepthMask(GLcontext
* ctx
, GLboolean mask
) //------------------
432 r700SetDepthState(ctx
);
436 * Change the culling mode.
438 * \note Mesa already filters redundant calls to this function.
440 static void r700CullFace(GLcontext
* ctx
, GLenum mode
) //-----------------
442 r700UpdateCulling(ctx
);
445 /* =============================================================
448 static void r700Fogfv(GLcontext
* ctx
, GLenum pname
, const GLfloat
* param
) //--------------
453 * Change the polygon orientation.
455 * \note Mesa already filters redundant calls to this function.
457 static void r700FrontFace(GLcontext
* ctx
, GLenum mode
) //------------------
459 r700UpdateCulling(ctx
);
462 static void r700ShadeModel(GLcontext
* ctx
, GLenum mode
) //--------------------
466 static void r700PointParameter(GLcontext
* ctx
, GLenum pname
, const GLfloat
* param
) //---------------
470 static void r700StencilFuncSeparate(GLcontext
* ctx
, GLenum face
,
471 GLenum func
, GLint ref
, GLuint mask
) //---------------------
476 static void r700StencilMaskSeparate(GLcontext
* ctx
, GLenum face
, GLuint mask
) //--------------
480 static void r700StencilOpSeparate(GLcontext
* ctx
, GLenum face
,
481 GLenum fail
, GLenum zfail
, GLenum zpass
) //--------------------
485 #define SUBPIXEL_X 0.125
486 #define SUBPIXEL_Y 0.125
488 static void r700Viewport(GLcontext
* ctx
,
492 GLsizei height
) //--------------------
494 context_t
*context
= R700_CONTEXT(ctx
);
496 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(context
->chipobj
.pvChipObj
);
498 __DRIdrawablePrivate
*dPriv
= context
->radeon
.dri
.drawable
;
500 GLfloat xoffset
= dPriv
? (GLfloat
) dPriv
->x
: 0;
501 GLfloat yoffset
= dPriv
? (GLfloat
) dPriv
->y
+ dPriv
->h
: 0;
503 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
505 GLfloat sx
, tx
, sy
, ty
, sz
, tz
;
508 switch (ctx
->Visual
.depthBits
)
511 scale
= 1.0 / (GLfloat
) 0xffff;
514 scale
= 1.0 / (GLfloat
) 0xffffff;
517 fprintf(stderr
, "Error: Unsupported depth %d... exiting\n",
518 ctx
->Visual
.depthBits
);
523 tx
= v
[MAT_TX
] + xoffset
+ SUBPIXEL_X
;
525 ty
= (-v
[MAT_TY
]) + yoffset
+ SUBPIXEL_Y
;
526 sz
= v
[MAT_SZ
] * scale
;
527 tz
= v
[MAT_TZ
] * scale
;
529 /* TODO : Need DMA flush as well. */
530 #if 0 /* to be enabled */
531 if(context
->cmdbuf
.count_used
> 0)
533 (context
->chipobj
.FlushCmdBuffer
)(context
);
535 #endif /* to be enabled */
536 r700
->PA_CL_VPORT_XSCALE
.u32All
= *((unsigned int*)(&sx
));
537 r700
->PA_CL_VPORT_XOFFSET
.u32All
= *((unsigned int*)(&tx
));
539 r700
->PA_CL_VPORT_YSCALE
.u32All
= *((unsigned int*)(&sy
));
540 r700
->PA_CL_VPORT_YOFFSET
.u32All
= *((unsigned int*)(&ty
));
542 r700
->PA_CL_VPORT_ZSCALE
.u32All
= *((unsigned int*)(&sz
));
543 r700
->PA_CL_VPORT_ZOFFSET
.u32All
= *((unsigned int*)(&tz
));
547 static void r700DepthRange(GLcontext
* ctx
, GLclampd nearval
, GLclampd farval
) //-------------
551 static void r700PointSize(GLcontext
* ctx
, GLfloat size
) //-------------------
555 static void r700LineWidth(GLcontext
* ctx
, GLfloat widthf
) //---------------
559 static void r700PolygonOffset(GLcontext
* ctx
, GLfloat factor
, GLfloat units
) //--------------
564 static void r700PolygonMode(GLcontext
* ctx
, GLenum face
, GLenum mode
) //------------------
568 static void r700RenderMode(GLcontext
* ctx
, GLenum mode
) //---------------------
572 static void r700ClipPlane( GLcontext
*ctx
, GLenum plane
, const GLfloat
*eq
) //-----------------
576 static void r700Scissor(GLcontext
* ctx
, GLint x
, GLint y
, GLsizei w
, GLsizei h
) //---------------
578 if (ctx
->Scissor
.Enabled
)
580 /* We don't pipeline cliprect changes */
581 /* r700Flush(ctx); */
583 //__DRIdrawablePrivate *dPriv = radeon->dri.drawable;
584 //int x1 = dPriv->x + ctx->Scissor.X;
585 //int y1 = dPriv->y + dPriv->h - (ctx->Scissor.Y + ctx->Scissor.Height);
587 //radeon->state.scissor.rect.x1 = x1;
588 //radeon->state.scissor.rect.y1 = y1;
589 //radeon->state.scissor.rect.x2 = x1 + ctx->Scissor.Width;
590 //radeon->state.scissor.rect.y2 = y1 + ctx->Scissor.Height;
591 /* radeonRecalcScissorRects(radeon); */
595 void r700SetRenderTarget(context_t
*context
)
597 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(context
->chipobj
.pvChipObj
);
599 struct radeon_renderbuffer
*rrb
;
600 unsigned int nPitchInPixel
;
602 /* screen/window/view */
603 SETfield(r700
->CB_TARGET_MASK
.u32All
, 0xF, TARGET0_ENABLE_shift
, TARGET0_ENABLE_mask
);
604 SETfield(r700
->CB_SHADER_MASK
.u32All
, 0xF, OUTPUT0_ENABLE_shift
, OUTPUT0_ENABLE_mask
);
607 r700
->PA_SC_SCREEN_SCISSOR_TL
.u32All
= 0x0;
609 SETfield(r700
->PA_SC_SCREEN_SCISSOR_BR
.u32All
, ((RADEONDRIPtr
)(context
->radeon
.radeonScreen
->driScreen
->pDevPriv
))->width
,
610 PA_SC_SCREEN_SCISSOR_BR__BR_X_shift
, PA_SC_SCREEN_SCISSOR_BR__BR_X_mask
);
611 SETfield(r700
->PA_SC_SCREEN_SCISSOR_BR
.u32All
, ((RADEONDRIPtr
)(context
->radeon
.radeonScreen
->driScreen
->pDevPriv
))->height
,
612 PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift
, PA_SC_SCREEN_SCISSOR_BR__BR_Y_mask
);
615 SETbit(r700
->PA_SC_WINDOW_SCISSOR_TL
.u32All
, WINDOW_OFFSET_DISABLE_bit
);
616 SETfield(r700
->PA_SC_WINDOW_SCISSOR_TL
.u32All
, context
->radeon
.dri
.drawable
->x
,
617 PA_SC_WINDOW_SCISSOR_TL__TL_X_shift
, PA_SC_WINDOW_SCISSOR_TL__TL_X_mask
);
618 SETfield(r700
->PA_SC_WINDOW_SCISSOR_TL
.u32All
, context
->radeon
.dri
.drawable
->y
,
619 PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift
, PA_SC_WINDOW_SCISSOR_TL__TL_Y_mask
);
621 SETfield(r700
->PA_SC_WINDOW_SCISSOR_BR
.u32All
, context
->radeon
.dri
.drawable
->x
+ context
->radeon
.dri
.drawable
->w
,
622 PA_SC_WINDOW_SCISSOR_BR__BR_X_shift
, PA_SC_WINDOW_SCISSOR_BR__BR_X_mask
);
623 SETfield(r700
->PA_SC_WINDOW_SCISSOR_BR
.u32All
, context
->radeon
.dri
.drawable
->y
+ context
->radeon
.dri
.drawable
->h
,
624 PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift
, PA_SC_WINDOW_SCISSOR_BR__BR_Y_mask
);
626 /* 4 clip rectangles */ /* TODO : set these clip rects according to context->currentDraw->numClipRects */
627 r700
->PA_SC_CLIPRECT_RULE
.u32All
= 0x0000FFFF;
629 SETfield(r700
->PA_SC_CLIPRECT_0_TL
.u32All
, context
->radeon
.dri
.drawable
->x
,
630 PA_SC_CLIPRECT_0_TL__TL_X_shift
, PA_SC_CLIPRECT_0_TL__TL_X_mask
);
631 SETfield(r700
->PA_SC_CLIPRECT_0_TL
.u32All
, context
->radeon
.dri
.drawable
->y
,
632 PA_SC_CLIPRECT_0_TL__TL_Y_shift
, PA_SC_CLIPRECT_0_TL__TL_Y_mask
);
633 SETfield(r700
->PA_SC_CLIPRECT_0_BR
.u32All
, context
->radeon
.dri
.drawable
->x
+ context
->radeon
.dri
.drawable
->w
,
634 PA_SC_CLIPRECT_0_BR__BR_X_shift
, PA_SC_CLIPRECT_0_BR__BR_X_mask
);
635 SETfield(r700
->PA_SC_CLIPRECT_0_BR
.u32All
, context
->radeon
.dri
.drawable
->y
+ context
->radeon
.dri
.drawable
->h
,
636 PA_SC_CLIPRECT_0_BR__BR_Y_shift
, PA_SC_CLIPRECT_0_BR__BR_Y_mask
);
638 r700
->PA_SC_CLIPRECT_1_TL
.u32All
= r700
->PA_SC_CLIPRECT_0_TL
.u32All
;
639 r700
->PA_SC_CLIPRECT_1_BR
.u32All
= r700
->PA_SC_CLIPRECT_0_BR
.u32All
;
640 r700
->PA_SC_CLIPRECT_2_TL
.u32All
= r700
->PA_SC_CLIPRECT_0_TL
.u32All
;
641 r700
->PA_SC_CLIPRECT_2_BR
.u32All
= r700
->PA_SC_CLIPRECT_0_BR
.u32All
;
642 r700
->PA_SC_CLIPRECT_3_TL
.u32All
= r700
->PA_SC_CLIPRECT_0_TL
.u32All
;
643 r700
->PA_SC_CLIPRECT_3_BR
.u32All
= r700
->PA_SC_CLIPRECT_0_BR
.u32All
;
645 /* edgerule for triangles, points, recs, lines */
646 r700
->PA_SC_EDGERULE
.u32All
= 0x555AA96A;
648 /* more....2d clip */
649 SETbit(r700
->PA_SC_GENERIC_SCISSOR_TL
.u32All
, WINDOW_OFFSET_DISABLE_bit
);
650 SETfield(r700
->PA_SC_GENERIC_SCISSOR_TL
.u32All
, context
->radeon
.dri
.drawable
->x
,
651 PA_SC_GENERIC_SCISSOR_TL__TL_X_shift
, PA_SC_GENERIC_SCISSOR_TL__TL_X_mask
);
652 SETfield(r700
->PA_SC_GENERIC_SCISSOR_TL
.u32All
, context
->radeon
.dri
.drawable
->y
,
653 PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift
, PA_SC_GENERIC_SCISSOR_TL__TL_Y_mask
);
654 SETfield(r700
->PA_SC_GENERIC_SCISSOR_BR
.u32All
, context
->radeon
.dri
.drawable
->x
+ context
->radeon
.dri
.drawable
->w
,
655 PA_SC_GENERIC_SCISSOR_BR__BR_X_shift
, PA_SC_GENERIC_SCISSOR_BR__BR_X_mask
);
656 SETfield(r700
->PA_SC_GENERIC_SCISSOR_BR
.u32All
, context
->radeon
.dri
.drawable
->y
+ context
->radeon
.dri
.drawable
->h
,
657 PA_SC_GENERIC_SCISSOR_BR__BR_Y_shift
, PA_SC_GENERIC_SCISSOR_BR__BR_Y_mask
);
659 SETbit(r700
->PA_SC_VPORT_SCISSOR_0_TL
.u32All
, WINDOW_OFFSET_DISABLE_bit
);
660 SETfield(r700
->PA_SC_VPORT_SCISSOR_0_TL
.u32All
, context
->radeon
.dri
.drawable
->x
,
661 PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift
, PA_SC_VPORT_SCISSOR_0_TL__TL_X_mask
);
662 SETfield(r700
->PA_SC_VPORT_SCISSOR_0_TL
.u32All
, context
->radeon
.dri
.drawable
->y
,
663 PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift
, PA_SC_VPORT_SCISSOR_0_TL__TL_Y_mask
);
664 SETfield(r700
->PA_SC_VPORT_SCISSOR_0_BR
.u32All
, context
->radeon
.dri
.drawable
->x
+ context
->radeon
.dri
.drawable
->w
,
665 PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift
, PA_SC_VPORT_SCISSOR_0_BR__BR_X_mask
);
666 SETfield(r700
->PA_SC_VPORT_SCISSOR_0_BR
.u32All
, context
->radeon
.dri
.drawable
->y
+ context
->radeon
.dri
.drawable
->h
,
667 PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift
, PA_SC_VPORT_SCISSOR_0_BR__BR_Y_mask
);
669 SETbit(r700
->PA_SC_VPORT_SCISSOR_1_TL
.u32All
, WINDOW_OFFSET_DISABLE_bit
);
670 SETfield(r700
->PA_SC_VPORT_SCISSOR_1_TL
.u32All
, context
->radeon
.dri
.drawable
->x
,
671 PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift
, PA_SC_VPORT_SCISSOR_0_TL__TL_X_mask
);
672 SETfield(r700
->PA_SC_VPORT_SCISSOR_1_TL
.u32All
, context
->radeon
.dri
.drawable
->y
,
673 PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift
, PA_SC_VPORT_SCISSOR_0_TL__TL_Y_mask
);
674 SETfield(r700
->PA_SC_VPORT_SCISSOR_1_BR
.u32All
, context
->radeon
.dri
.drawable
->x
+ context
->radeon
.dri
.drawable
->w
,
675 PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift
, PA_SC_VPORT_SCISSOR_0_BR__BR_X_mask
);
676 SETfield(r700
->PA_SC_VPORT_SCISSOR_1_BR
.u32All
, context
->radeon
.dri
.drawable
->y
+ context
->radeon
.dri
.drawable
->h
,
677 PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift
, PA_SC_VPORT_SCISSOR_0_BR__BR_Y_mask
);
680 r700Viewport(GL_CONTEXT(context
),
683 context
->radeon
.dri
.drawable
->w
,
684 context
->radeon
.dri
.drawable
->h
);
686 rrb
= radeon_get_colorbuffer(&context
->radeon
);
687 if (!rrb
|| !rrb
->bo
) {
688 fprintf(stderr
, "no rrb\n");
693 r700
->CB_COLOR0_BASE
.u32All
= context
->radeon
.state
.color
.draw_offset
;
695 nPitchInPixel
= rrb
->pitch
/rrb
->cpp
;
696 SETfield(r700
->CB_COLOR0_SIZE
.u32All
, (nPitchInPixel
/8)-1,
697 PITCH_TILE_MAX_shift
, PITCH_TILE_MAX_mask
);
698 SETfield(r700
->CB_COLOR0_SIZE
.u32All
, ( (nPitchInPixel
* context
->radeon
.radeonScreen
->driScreen
->fbHeight
)/64 )-1,
699 SLICE_TILE_MAX_shift
, SLICE_TILE_MAX_mask
);
700 r700
->CB_COLOR0_BASE
.u32All
= 0;
701 SETfield(r700
->CB_COLOR0_INFO
.u32All
, ENDIAN_NONE
, ENDIAN_shift
, ENDIAN_mask
);
702 SETfield(r700
->CB_COLOR0_INFO
.u32All
, ARRAY_LINEAR_GENERAL
,
703 CB_COLOR0_INFO__ARRAY_MODE_shift
, CB_COLOR0_INFO__ARRAY_MODE_mask
);
706 SETfield(r700
->CB_COLOR0_INFO
.u32All
, COLOR_8_8_8_8
,
707 CB_COLOR0_INFO__FORMAT_shift
, CB_COLOR0_INFO__FORMAT_mask
);
708 SETfield(r700
->CB_COLOR0_INFO
.u32All
, SWAP_ALT
, COMP_SWAP_shift
, COMP_SWAP_mask
);
712 SETfield(r700
->CB_COLOR0_INFO
.u32All
, COLOR_5_6_5
,
713 CB_COLOR0_INFO__FORMAT_shift
, CB_COLOR0_INFO__FORMAT_mask
);
714 SETfield(r700
->CB_COLOR0_INFO
.u32All
, SWAP_ALT_REV
,
715 COMP_SWAP_shift
, COMP_SWAP_mask
);
717 SETbit(r700
->CB_COLOR0_INFO
.u32All
, SOURCE_FORMAT_bit
);
718 SETbit(r700
->CB_COLOR0_INFO
.u32All
, BLEND_CLAMP_bit
);
719 SETfield(r700
->CB_COLOR0_INFO
.u32All
, NUMBER_UNORM
, NUMBER_TYPE_shift
, NUMBER_TYPE_mask
);
722 r700
->DB_DEPTH_SIZE
.u32All
= 0;
723 r700
->DB_DEPTH_BASE
.u32All
= 0;
724 r700
->DB_DEPTH_INFO
.u32All
= 0;
726 r700
->DB_DEPTH_CONTROL
.u32All
= 0;
727 r700
->DB_DEPTH_CLEAR
.u32All
= 0x3F800000;
728 r700
->DB_DEPTH_VIEW
.u32All
= 0;
729 r700
->DB_RENDER_CONTROL
.u32All
= 0;
730 r700
->DB_RENDER_OVERRIDE
.u32All
= 0;
731 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIZ_ENABLE_shift
, FORCE_HIZ_ENABLE_mask
);
732 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIS_ENABLE0_shift
, FORCE_HIS_ENABLE0_mask
);
733 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIS_ENABLE1_shift
, FORCE_HIS_ENABLE1_mask
);
735 rrb
= radeon_get_depthbuffer(&context
->radeon
);
739 nPitchInPixel
= rrb
->pitch
/rrb
->cpp
;
741 SETfield(r700
->DB_DEPTH_SIZE
.u32All
, (nPitchInPixel
/8)-1,
742 PITCH_TILE_MAX_shift
, PITCH_TILE_MAX_mask
);
743 SETfield(r700
->DB_DEPTH_SIZE
.u32All
, ( (nPitchInPixel
* context
->radeon
.radeonScreen
->driScreen
->fbHeight
)/64 )-1,
744 SLICE_TILE_MAX_shift
, SLICE_TILE_MAX_mask
); /* size in pixel / 64 - 1 */
748 switch (GL_CONTEXT(context
)->Visual
.depthBits
)
752 SETfield(r700
->DB_DEPTH_INFO
.u32All
, DEPTH_8_24
,
753 DB_DEPTH_INFO__FORMAT_shift
, DB_DEPTH_INFO__FORMAT_mask
);
756 fprintf(stderr
, "Error: Unsupported depth %d... exiting\n",
757 GL_CONTEXT(context
)->Visual
.depthBits
);
763 SETfield(r700
->DB_DEPTH_INFO
.u32All
, DEPTH_16
,
764 DB_DEPTH_INFO__FORMAT_shift
, DB_DEPTH_INFO__FORMAT_mask
);
766 SETfield(r700
->DB_DEPTH_INFO
.u32All
, ARRAY_2D_TILED_THIN1
,
767 DB_DEPTH_INFO__ARRAY_MODE_shift
, DB_DEPTH_INFO__ARRAY_MODE_mask
);
768 /* r700->DB_PREFETCH_LIMIT.bits.DEPTH_HEIGHT_TILE_MAX = (context->currentDraw->h >> 3) - 1; */ /* z buffer sie may much bigger than what need, so use actual used h. */
772 * Calculate initial hardware state and register state functions.
773 * Assumes that the command buffer and state atoms have been
774 * initialized already.
776 void r700InitState(GLcontext
* ctx
) //-------------------
778 context_t
*context
= R700_CONTEXT(ctx
);
780 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(context
->chipobj
.pvChipObj
);
782 /* Turn off vgt reuse */
783 r700
->VGT_REUSE_OFF
.u32All
= 0;
784 SETbit(r700
->VGT_REUSE_OFF
.u32All
, REUSE_OFF_bit
);
786 /* Specify offsetting and clamp values for vertices */
787 r700
->VGT_MAX_VTX_INDX
.u32All
= 0xFFFFFF;
788 r700
->VGT_MIN_VTX_INDX
.u32All
= 0;
789 r700
->VGT_INDX_OFFSET
.u32All
= 0;
791 /* Specify the number of instances */
792 r700
->VGT_DMA_NUM_INSTANCES
.u32All
= 1;
794 /* not alpha blend */
795 CLEARfield(r700
->SX_ALPHA_TEST_CONTROL
.u32All
, ALPHA_FUNC_mask
);
796 CLEARbit(r700
->SX_ALPHA_TEST_CONTROL
.u32All
, ALPHA_TEST_ENABLE_bit
);
798 /* defualt shader connections. */
799 r700
->SPI_VS_OUT_ID_0
.u32All
= 0x03020100;
800 r700
->SPI_VS_OUT_ID_1
.u32All
= 0x07060504;
802 r700
->SPI_PS_INPUT_CNTL_0
.u32All
= 0x00000800;
803 r700
->SPI_PS_INPUT_CNTL_1
.u32All
= 0x00000801;
804 r700
->SPI_PS_INPUT_CNTL_2
.u32All
= 0x00000802;
806 SETfield(r700
->CB_COLOR_CONTROL
.u32All
, 0xCC, ROP3_shift
, ROP3_mask
);
807 CLEARbit(r700
->CB_COLOR_CONTROL
.u32All
, PER_MRT_BLEND_bit
);
808 CLEARfield(r700
->CB_BLEND0_CONTROL
.u32All
, COLOR_SRCBLEND_mask
); /* no dst blend */
809 CLEARfield(r700
->CB_BLEND0_CONTROL
.u32All
, ALPHA_SRCBLEND_mask
); /* no dst blend */
811 r700
->DB_SHADER_CONTROL
.u32All
= 0;
812 SETbit(r700
->DB_SHADER_CONTROL
.u32All
, DUAL_EXPORT_ENABLE_bit
);
814 /* Set up the culling control register */
815 SETfield(r700
->PA_SU_SC_MODE_CNTL
.u32All
, X_DRAW_TRIANGLES
,
816 POLYMODE_FRONT_PTYPE_shift
, POLYMODE_FRONT_PTYPE_mask
);
817 SETfield(r700
->PA_SU_SC_MODE_CNTL
.u32All
, X_DRAW_TRIANGLES
,
818 POLYMODE_BACK_PTYPE_shift
, POLYMODE_BACK_PTYPE_mask
);
820 /* Do scale XY and Z by 1/W0. */
821 r700
->bEnablePerspective
= GL_TRUE
;
822 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_XY_FMT_bit
);
823 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_Z_FMT_bit
);
824 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_W0_FMT_bit
);
826 /* Enable viewport scaling for all three axis */
827 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_X_SCALE_ENA_bit
);
828 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_X_OFFSET_ENA_bit
);
829 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Y_SCALE_ENA_bit
);
830 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Y_OFFSET_ENA_bit
);
831 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Z_SCALE_ENA_bit
);
832 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Z_OFFSET_ENA_bit
);
834 /* Set up point sizes and min/max values */
835 SETfield(r700
->PA_SU_POINT_SIZE
.u32All
, 0x8,
836 PA_SU_POINT_SIZE__HEIGHT_shift
, PA_SU_POINT_SIZE__HEIGHT_mask
);
837 SETfield(r700
->PA_SU_POINT_SIZE
.u32All
, 0x8,
838 PA_SU_POINT_SIZE__WIDTH_shift
, PA_SU_POINT_SIZE__WIDTH_mask
);
839 CLEARfield(r700
->PA_SU_POINT_MINMAX
.u32All
, MIN_SIZE_mask
);
840 SETfield(r700
->PA_SU_POINT_MINMAX
.u32All
, 0x8000, MAX_SIZE_shift
, MAX_SIZE_mask
);
842 /* Set up line control */
843 SETfield(r700
->PA_SU_LINE_CNTL
.u32All
, 0x8,
844 PA_SU_LINE_CNTL__WIDTH_shift
, PA_SU_LINE_CNTL__WIDTH_mask
);
846 r700
->PA_SC_LINE_CNTL
.u32All
= 0;
847 CLEARbit(r700
->PA_SC_LINE_CNTL
.u32All
, EXPAND_LINE_WIDTH_bit
);
848 SETbit(r700
->PA_SC_LINE_CNTL
.u32All
, LAST_PIXEL_bit
);
850 /* Set up vertex control */
851 r700
->PA_SU_VTX_CNTL
.u32All
= 0;
852 CLEARfield(r700
->PA_SU_VTX_CNTL
.u32All
, QUANT_MODE_mask
);
853 SETbit(r700
->PA_SU_VTX_CNTL
.u32All
, PIX_CENTER_bit
);
854 SETfield(r700
->PA_SU_VTX_CNTL
.u32All
, X_ROUND_TO_EVEN
,
855 PA_SU_VTX_CNTL__ROUND_MODE_shift
, PA_SU_VTX_CNTL__ROUND_MODE_mask
);
857 /* to 1.0 = no guard band */
858 r700
->PA_CL_GB_VERT_CLIP_ADJ
.u32All
= 0x3F800000; /* 1.0 */
859 r700
->PA_CL_GB_VERT_DISC_ADJ
.u32All
= 0x3F800000;
860 r700
->PA_CL_GB_HORZ_CLIP_ADJ
.u32All
= 0x3F800000;
861 r700
->PA_CL_GB_HORZ_DISC_ADJ
.u32All
= 0x3F800000;
863 /* Disble color compares */
864 SETfield(r700
->CB_CLRCMP_CONTROL
.u32All
, CLRCMP_DRAW_ALWAYS
,
865 CLRCMP_FCN_SRC_shift
, CLRCMP_FCN_SRC_mask
);
866 SETfield(r700
->CB_CLRCMP_CONTROL
.u32All
, CLRCMP_DRAW_ALWAYS
,
867 CLRCMP_FCN_DST_shift
, CLRCMP_FCN_DST_mask
);
868 SETfield(r700
->CB_CLRCMP_CONTROL
.u32All
, CLRCMP_SEL_SRC
,
869 CLRCMP_FCN_SEL_shift
, CLRCMP_FCN_SEL_mask
);
871 /* Zero out source */
872 r700
->CB_CLRCMP_SRC
.u32All
= 0x00000000;
874 /* Put a compare color in for error checking */
875 r700
->CB_CLRCMP_DST
.u32All
= 0x000000FF;
877 /* Set up color compare mask */
878 r700
->CB_CLRCMP_MSK
.u32All
= 0xFFFFFFFF;
880 /* Enable all samples for multi-sample anti-aliasing */
881 r700
->PA_SC_AA_MASK
.u32All
= 0xFFFFFFFF;
883 r700
->PA_SC_AA_CONFIG
.u32All
= 0;
885 SETfield(r700
->VGT_OUT_DEALLOC_CNTL
.u32All
, 16, DEALLOC_DIST_shift
, DEALLOC_DIST_mask
);
886 SETfield(r700
->VGT_VERTEX_REUSE_BLOCK_CNTL
.u32All
, 14, VTX_REUSE_DEPTH_shift
, VTX_REUSE_DEPTH_mask
);
888 r700
->SX_MISC
.u32All
= 0;
891 r700
->DB_DEPTH_SIZE
.u32All
= 0;
892 r700
->DB_DEPTH_BASE
.u32All
= 0;
893 r700
->DB_DEPTH_INFO
.u32All
= 0;
894 r700
->DB_DEPTH_CONTROL
.u32All
= 0;
895 r700
->DB_DEPTH_CLEAR
.u32All
= 0x3F800000;
896 r700
->DB_DEPTH_VIEW
.u32All
= 0;
897 r700
->DB_RENDER_CONTROL
.u32All
= 0;
898 r700
->DB_RENDER_OVERRIDE
.u32All
= 0;
899 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIZ_ENABLE_shift
, FORCE_HIZ_ENABLE_mask
);
900 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIS_ENABLE0_shift
, FORCE_HIS_ENABLE0_mask
);
901 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIS_ENABLE1_shift
, FORCE_HIS_ENABLE1_mask
);
904 r700
->CB_COLOR0_SIZE
.u32All
= 0;
905 r700
->CB_COLOR0_BASE
.u32All
= 0;
906 r700
->CB_COLOR0_INFO
.u32All
= 0;
907 SETbit(r700
->CB_COLOR0_INFO
.u32All
, SOURCE_FORMAT_bit
);
908 SETbit(r700
->CB_COLOR0_INFO
.u32All
, BLEND_CLAMP_bit
);
909 SETfield(r700
->CB_COLOR0_INFO
.u32All
, NUMBER_UNORM
, NUMBER_TYPE_shift
, NUMBER_TYPE_mask
);
910 r700
->CB_COLOR0_VIEW
.u32All
= 0;
911 r700
->CB_COLOR0_TILE
.u32All
= 0;
912 r700
->CB_COLOR0_FRAG
.u32All
= 0;
913 r700
->CB_COLOR0_MASK
.u32All
= 0;
915 r700
->PA_SC_VPORT_ZMAX_0
.u32All
= 0x3F800000;
918 void r700InitStateFuncs(struct dd_function_table
*functions
) //-----------------
920 functions
->UpdateState
= r700InvalidateState
;
921 functions
->AlphaFunc
= r700AlphaFunc
;
922 functions
->BlendColor
= r700BlendColor
;
923 functions
->BlendEquationSeparate
= r700BlendEquationSeparate
;
924 functions
->BlendFuncSeparate
= r700BlendFuncSeparate
;
925 functions
->Enable
= r700Enable
;
926 functions
->ColorMask
= r700ColorMask
;
927 functions
->DepthFunc
= r700DepthFunc
;
928 functions
->DepthMask
= r700DepthMask
;
929 functions
->CullFace
= r700CullFace
;
930 functions
->Fogfv
= r700Fogfv
;
931 functions
->FrontFace
= r700FrontFace
;
932 functions
->ShadeModel
= r700ShadeModel
;
934 /* ARB_point_parameters */
935 functions
->PointParameterfv
= r700PointParameter
;
937 /* Stencil related */
938 functions
->StencilFuncSeparate
= r700StencilFuncSeparate
;
939 functions
->StencilMaskSeparate
= r700StencilMaskSeparate
;
940 functions
->StencilOpSeparate
= r700StencilOpSeparate
;
942 /* Viewport related */
943 functions
->Viewport
= r700Viewport
;
944 functions
->DepthRange
= r700DepthRange
;
945 functions
->PointSize
= r700PointSize
;
946 functions
->LineWidth
= r700LineWidth
;
948 functions
->PolygonOffset
= r700PolygonOffset
;
949 functions
->PolygonMode
= r700PolygonMode
;
951 functions
->RenderMode
= r700RenderMode
;
953 functions
->ClipPlane
= r700ClipPlane
;
955 functions
->Scissor
= r700Scissor
;