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"
33 #include "main/context.h"
35 #include "main/simple_list.h"
38 #include "tnl/t_pipeline.h"
39 #include "tnl/t_vp_build.h"
40 #include "swrast/swrast.h"
41 #include "swrast_setup/swrast_setup.h"
42 #include "main/api_arrayelt.h"
43 #include "main/state.h"
44 #include "main/framebuffer.h"
46 #include "shader/prog_parameter.h"
47 #include "shader/prog_statevars.h"
49 #include "main/texformat.h"
51 #include "r600_context.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
) //------------------
118 //radeonUpdateScissor(ctx);
124 * Tell the card where to render (offset, pitch).
125 * Effected by glDrawBuffer, etc
127 void r700UpdateDrawBuffer(GLcontext
* ctx
) /* TODO */ //---------------------
129 #if 0 /* to be enabled */
130 context_t
*context
= R700_CONTEXT(ctx
);
132 switch (ctx
->DrawBuffer
->_ColorDrawBufferIndexes
[0])
134 case BUFFER_FRONT_LEFT
:
135 context
->target
.rt
= context
->screen
->frontBuffer
;
137 case BUFFER_BACK_LEFT
:
138 context
->target
.rt
= context
->screen
->backBuffer
;
141 memset (&context
->target
.rt
, sizeof(context
->target
.rt
), 0);
143 #endif /* to be enabled */
146 static void r700FetchStateParameter(GLcontext
* ctx
,
147 const gl_state_index state
[STATE_LENGTH
],
150 context_t
*context
= R700_CONTEXT(ctx
);
155 void r700UpdateStateParameters(GLcontext
* ctx
, GLuint new_state
) //--------------------
157 struct r700_fragment_program
*fp
;
158 struct gl_program_parameter_list
*paramList
;
161 if (!(new_state
& (_NEW_BUFFERS
| _NEW_PROGRAM
)))
164 fp
= (struct r700_fragment_program
*)ctx
->FragmentProgram
._Current
;
170 paramList
= fp
->mesa_program
.Base
.Parameters
;
177 for (i
= 0; i
< paramList
->NumParameters
; i
++)
179 if (paramList
->Parameters
[i
].Type
== PROGRAM_STATE_VAR
)
181 r700FetchStateParameter(ctx
,
182 paramList
->Parameters
[i
].
184 paramList
->ParameterValues
[i
]);
190 * Called by Mesa after an internal state update.
192 static void r700InvalidateState(GLcontext
* ctx
, GLuint new_state
) //-------------------
194 context_t
*context
= R700_CONTEXT(ctx
);
196 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
198 _swrast_InvalidateState(ctx
, new_state
);
199 _swsetup_InvalidateState(ctx
, new_state
);
200 _vbo_InvalidateState(ctx
, new_state
);
201 _tnl_InvalidateState(ctx
, new_state
);
202 _ae_invalidate_state(ctx
, new_state
);
204 if (new_state
& (_NEW_BUFFERS
| _NEW_COLOR
| _NEW_PIXEL
))
206 _mesa_update_framebuffer(ctx
);
207 /* this updates the DrawBuffer's Width/Height if it's a FBO */
208 _mesa_update_draw_buffer_bounds(ctx
);
210 r700UpdateDrawBuffer(ctx
);
213 r700UpdateStateParameters(ctx
, new_state
);
215 if(GL_TRUE
== r700
->bEnablePerspective
)
217 /* Do scale XY and Z by 1/W0 for perspective correction on pos. For orthogonal case, set both to one. */
218 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_XY_FMT_bit
);
219 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_Z_FMT_bit
);
221 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_W0_FMT_bit
);
223 SETbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, PERSP_GRADIENT_ENA_bit
);
224 CLEARbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, LINEAR_GRADIENT_ENA_bit
);
228 /* For orthogonal case. */
229 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_XY_FMT_bit
);
230 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_Z_FMT_bit
);
232 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_W0_FMT_bit
);
234 CLEARbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, PERSP_GRADIENT_ENA_bit
);
235 SETbit(r700
->SPI_PS_IN_CONTROL_0
.u32All
, LINEAR_GRADIENT_ENA_bit
);
238 context
->radeon
.NewGLState
|= new_state
;
241 static void r700SetDepthState(GLcontext
* ctx
)
243 context_t
*context
= R700_CONTEXT(ctx
);
245 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
249 SETbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_ENABLE_bit
);
252 SETbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_WRITE_ENABLE_bit
);
256 CLEARbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_WRITE_ENABLE_bit
);
259 switch (ctx
->Depth
.Func
)
262 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_NEVER
,
263 ZFUNC_shift
, ZFUNC_mask
);
266 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_LESS
,
267 ZFUNC_shift
, ZFUNC_mask
);
270 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_EQUAL
,
271 ZFUNC_shift
, ZFUNC_mask
);
274 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_LEQUAL
,
275 ZFUNC_shift
, ZFUNC_mask
);
278 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_GREATER
,
279 ZFUNC_shift
, ZFUNC_mask
);
282 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_NOTEQUAL
,
283 ZFUNC_shift
, ZFUNC_mask
);
286 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_GEQUAL
,
287 ZFUNC_shift
, ZFUNC_mask
);
290 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_ALWAYS
,
291 ZFUNC_shift
, ZFUNC_mask
);
294 SETfield(r700
->DB_DEPTH_CONTROL
.u32All
, FRAG_ALWAYS
,
295 ZFUNC_shift
, ZFUNC_mask
);
301 CLEARbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_ENABLE_bit
);
302 CLEARbit(r700
->DB_DEPTH_CONTROL
.u32All
, Z_WRITE_ENABLE_bit
);
306 static void r700AlphaFunc(GLcontext
* ctx
, GLenum func
, GLfloat ref
) //---------------
311 static void r700BlendColor(GLcontext
* ctx
, const GLfloat cf
[4]) //----------------
315 static void r700BlendEquationSeparate(GLcontext
* ctx
,
316 GLenum modeRGB
, GLenum modeA
) //-----------------
320 static void r700BlendFuncSeparate(GLcontext
* ctx
,
321 GLenum sfactorRGB
, GLenum dfactorRGB
,
322 GLenum sfactorA
, GLenum dfactorA
) //------------------------
327 * Translate LogicOp enums into hardware representation.
328 * Both use a very logical bit-wise layout, but unfortunately the order
329 * of bits is reversed.
331 static GLuint
translate_logicop(GLenum logicop
)
333 GLuint bits
= logicop
- GL_CLEAR
;
334 bits
= ((bits
& 1) << 3) | ((bits
& 2) << 1) | ((bits
& 4) >> 1) | ((bits
& 8) >> 3);
339 * Used internally to update the r300->hw hardware state to match the
340 * current OpenGL state.
342 static void r700SetLogicOpState(GLcontext
*ctx
)
344 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&R700_CONTEXT(ctx
)->hw
);
346 if (RGBA_LOGICOP_ENABLED(ctx
))
347 SETfield(r700
->CB_COLOR_CONTROL
.u32All
,
348 translate_logicop(ctx
->Color
.LogicOp
), ROP3_shift
, ROP3_mask
);
350 SETfield(r700
->CB_COLOR_CONTROL
.u32All
, 0xCC, ROP3_shift
, ROP3_mask
);
354 * Called by Mesa when an application program changes the LogicOp state
357 static void r700LogicOpcode(GLcontext
*ctx
, GLenum logicop
)
359 if (RGBA_LOGICOP_ENABLED(ctx
))
360 r700SetLogicOpState(ctx
);
363 static void r700UpdateCulling(GLcontext
* ctx
)
365 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&R700_CONTEXT(ctx
)->hw
);
367 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
);
368 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
369 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
371 if (ctx
->Polygon
.CullFlag
)
373 switch (ctx
->Polygon
.CullFaceMode
)
376 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
377 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
380 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
381 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
383 case GL_FRONT_AND_BACK
:
384 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
385 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
388 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_FRONT_bit
);
389 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, CULL_BACK_bit
);
394 switch (ctx
->Polygon
.FrontFace
)
397 SETbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
);
400 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
);
403 CLEARbit(r700
->PA_SU_SC_MODE_CNTL
.u32All
, FACE_bit
); /* default: ccw */
408 static void r700UpdateLineStipple(GLcontext
* ctx
)
410 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&R700_CONTEXT(ctx
)->hw
);
411 if (ctx
->Line
.StippleFlag
)
413 SETbit(r700
->PA_SC_MODE_CNTL
.u32All
, LINE_STIPPLE_ENABLE_bit
);
417 CLEARbit(r700
->PA_SC_MODE_CNTL
.u32All
, LINE_STIPPLE_ENABLE_bit
);
421 static void r700Enable(GLcontext
* ctx
, GLenum cap
, GLboolean state
) //------------------
423 context_t
*context
= R700_CONTEXT(ctx
);
435 //r700SetAlphaState(ctx);
437 case GL_COLOR_LOGIC_OP
:
438 r700SetLogicOpState(ctx
);
439 /* fall-through, because logic op overrides blending */
441 //r700SetBlendState(ctx);
449 //r700SetClipPlaneState(ctx, cap, state);
452 r700SetDepthState(ctx
);
454 case GL_STENCIL_TEST
:
455 //r700SetStencilState(ctx, state);
458 r700UpdateCulling(ctx
);
460 case GL_POLYGON_OFFSET_POINT
:
461 case GL_POLYGON_OFFSET_LINE
:
462 case GL_POLYGON_OFFSET_FILL
:
463 //r700SetPolygonOffsetState(ctx, state);
465 case GL_SCISSOR_TEST
:
466 radeon_firevertices(&context
->radeon
);
467 context
->radeon
.state
.scissor
.enabled
= state
;
468 radeonUpdateScissor(ctx
);
470 case GL_LINE_STIPPLE
:
471 r700UpdateLineStipple(ctx
);
480 * Handle glColorMask()
482 static void r700ColorMask(GLcontext
* ctx
,
483 GLboolean r
, GLboolean g
, GLboolean b
, GLboolean a
) //------------------
485 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&R700_CONTEXT(ctx
)->hw
);
486 unsigned int mask
= ((r
? 1 : 0) |
491 if (mask
!= r700
->CB_SHADER_MASK
.u32All
)
492 SETfield(r700
->CB_SHADER_MASK
.u32All
, mask
, OUTPUT0_ENABLE_shift
, OUTPUT0_ENABLE_mask
);
496 * Change the depth testing function.
498 * \note Mesa already filters redundant calls to this function.
500 static void r700DepthFunc(GLcontext
* ctx
, GLenum func
) //--------------------
502 r700SetDepthState(ctx
);
506 * Enable/Disable depth writing.
508 * \note Mesa already filters redundant calls to this function.
510 static void r700DepthMask(GLcontext
* ctx
, GLboolean mask
) //------------------
512 r700SetDepthState(ctx
);
516 * Change the culling mode.
518 * \note Mesa already filters redundant calls to this function.
520 static void r700CullFace(GLcontext
* ctx
, GLenum mode
) //-----------------
522 r700UpdateCulling(ctx
);
525 /* =============================================================
528 static void r700Fogfv(GLcontext
* ctx
, GLenum pname
, const GLfloat
* param
) //--------------
533 * Change the polygon orientation.
535 * \note Mesa already filters redundant calls to this function.
537 static void r700FrontFace(GLcontext
* ctx
, GLenum mode
) //------------------
539 r700UpdateCulling(ctx
);
542 static void r700ShadeModel(GLcontext
* ctx
, GLenum mode
) //--------------------
544 context_t
*context
= R700_CONTEXT(ctx
);
545 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
547 /* also need to set/clear FLAT_SHADE bit per param in SPI_PS_INPUT_CNTL_[0-31] */
550 SETbit(r700
->SPI_INTERP_CONTROL_0
.u32All
, FLAT_SHADE_ENA_bit
);
553 CLEARbit(r700
->SPI_INTERP_CONTROL_0
.u32All
, FLAT_SHADE_ENA_bit
);
560 static void r700PointParameter(GLcontext
* ctx
, GLenum pname
, const GLfloat
* param
) //---------------
564 static void r700StencilFuncSeparate(GLcontext
* ctx
, GLenum face
,
565 GLenum func
, GLint ref
, GLuint mask
) //---------------------
570 static void r700StencilMaskSeparate(GLcontext
* ctx
, GLenum face
, GLuint mask
) //--------------
574 static void r700StencilOpSeparate(GLcontext
* ctx
, GLenum face
,
575 GLenum fail
, GLenum zfail
, GLenum zpass
) //--------------------
579 static void r700UpdateWindow(GLcontext
* ctx
, int id
) //--------------------
582 context_t
*context
= R700_CONTEXT(ctx
);
583 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
584 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&context
->radeon
);
585 GLfloat xoffset
= dPriv
? (GLfloat
) dPriv
->x
: 0;
586 GLfloat yoffset
= dPriv
? (GLfloat
) dPriv
->y
+ dPriv
->h
: 0;
587 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
588 const GLfloat depthScale
= 1.0F
/ ctx
->DrawBuffer
->_DepthMaxF
;
589 const GLboolean render_to_fbo
= (ctx
->DrawBuffer
->Name
!= 0);
590 GLfloat y_scale
, y_bias
;
600 GLfloat sx
= v
[MAT_SX
];
601 GLfloat tx
= v
[MAT_TX
] + xoffset
;
602 GLfloat sy
= v
[MAT_SY
] * y_scale
;
603 GLfloat ty
= (v
[MAT_TY
] * y_scale
) + y_bias
;
604 GLfloat sz
= v
[MAT_SZ
] * depthScale
;
605 GLfloat tz
= v
[MAT_TZ
] * depthScale
;
607 /* TODO : Need DMA flush as well. */
609 r700
->viewport
[id
].PA_CL_VPORT_XSCALE
.f32All
= sx
;
610 r700
->viewport
[id
].PA_CL_VPORT_XOFFSET
.f32All
= tx
;
612 r700
->viewport
[id
].PA_CL_VPORT_YSCALE
.f32All
= sy
;
613 r700
->viewport
[id
].PA_CL_VPORT_YOFFSET
.f32All
= ty
;
615 r700
->viewport
[id
].PA_CL_VPORT_ZSCALE
.f32All
= sz
;
616 r700
->viewport
[id
].PA_CL_VPORT_ZOFFSET
.f32All
= tz
;
618 r700
->viewport
[id
].enabled
= GL_TRUE
;
620 r700SetScissor(context
);
624 static void r700Viewport(GLcontext
* ctx
,
628 GLsizei height
) //--------------------
630 r700UpdateWindow(ctx
, 0);
632 radeon_viewport(ctx
, x
, y
, width
, height
);
635 static void r700DepthRange(GLcontext
* ctx
, GLclampd nearval
, GLclampd farval
) //-------------
637 r700UpdateWindow(ctx
, 0);
640 static void r700PointSize(GLcontext
* ctx
, GLfloat size
) //-------------------
644 static void r700LineWidth(GLcontext
* ctx
, GLfloat widthf
) //---------------
646 context_t
*context
= R700_CONTEXT(ctx
);
647 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
648 uint32_t lineWidth
= (uint32_t)((widthf
* 0.5) * (1 << 4));
649 if (lineWidth
> 0xFFFF)
651 SETfield(r700
->PA_SU_LINE_CNTL
.u32All
,(uint16_t)lineWidth
,
652 PA_SU_LINE_CNTL__WIDTH_shift
, PA_SU_LINE_CNTL__WIDTH_mask
);
655 static void r700LineStipple(GLcontext
*ctx
, GLint factor
, GLushort pattern
)
657 context_t
*context
= R700_CONTEXT(ctx
);
658 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
660 SETfield(r700
->PA_SC_LINE_STIPPLE
.u32All
, pattern
, LINE_PATTERN_shift
, LINE_PATTERN_mask
);
661 SETfield(r700
->PA_SC_LINE_STIPPLE
.u32All
, (factor
-1), REPEAT_COUNT_shift
, REPEAT_COUNT_mask
);
662 SETfield(r700
->PA_SC_LINE_STIPPLE
.u32All
, 1, AUTO_RESET_CNTL_shift
, AUTO_RESET_CNTL_mask
);
665 static void r700PolygonOffset(GLcontext
* ctx
, GLfloat factor
, GLfloat units
) //--------------
670 static void r700PolygonMode(GLcontext
* ctx
, GLenum face
, GLenum mode
) //------------------
674 static void r700RenderMode(GLcontext
* ctx
, GLenum mode
) //---------------------
678 static void r700ClipPlane( GLcontext
*ctx
, GLenum plane
, const GLfloat
*eq
) //-----------------
682 void r700SetScissor(context_t
*context
) //---------------
684 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
685 unsigned x1
, y1
, x2
, y2
;
687 struct radeon_renderbuffer
*rrb
;
689 rrb
= radeon_get_colorbuffer(&context
->radeon
);
690 if (!rrb
|| !rrb
->bo
) {
693 if (context
->radeon
.state
.scissor
.enabled
) {
694 x1
= context
->radeon
.state
.scissor
.rect
.x1
;
695 y1
= context
->radeon
.state
.scissor
.rect
.y1
;
696 x2
= context
->radeon
.state
.scissor
.rect
.x2
- 1;
697 y2
= context
->radeon
.state
.scissor
.rect
.y2
- 1;
701 x2
= rrb
->dPriv
->x
+ rrb
->dPriv
->w
;
702 y2
= rrb
->dPriv
->y
+ rrb
->dPriv
->h
;
706 SETbit(r700
->PA_SC_WINDOW_SCISSOR_TL
.u32All
, WINDOW_OFFSET_DISABLE_bit
);
707 SETfield(r700
->PA_SC_WINDOW_SCISSOR_TL
.u32All
, x1
,
708 PA_SC_WINDOW_SCISSOR_TL__TL_X_shift
, PA_SC_WINDOW_SCISSOR_TL__TL_X_mask
);
709 SETfield(r700
->PA_SC_WINDOW_SCISSOR_TL
.u32All
, y1
,
710 PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift
, PA_SC_WINDOW_SCISSOR_TL__TL_Y_mask
);
712 SETfield(r700
->PA_SC_WINDOW_SCISSOR_BR
.u32All
, x2
,
713 PA_SC_WINDOW_SCISSOR_BR__BR_X_shift
, PA_SC_WINDOW_SCISSOR_BR__BR_X_mask
);
714 SETfield(r700
->PA_SC_WINDOW_SCISSOR_BR
.u32All
, y2
,
715 PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift
, PA_SC_WINDOW_SCISSOR_BR__BR_Y_mask
);
718 SETfield(r700
->PA_SC_CLIPRECT_0_TL
.u32All
, x1
,
719 PA_SC_CLIPRECT_0_TL__TL_X_shift
, PA_SC_CLIPRECT_0_TL__TL_X_mask
);
720 SETfield(r700
->PA_SC_CLIPRECT_0_TL
.u32All
, y1
,
721 PA_SC_CLIPRECT_0_TL__TL_Y_shift
, PA_SC_CLIPRECT_0_TL__TL_Y_mask
);
722 SETfield(r700
->PA_SC_CLIPRECT_0_BR
.u32All
, x2
,
723 PA_SC_CLIPRECT_0_BR__BR_X_shift
, PA_SC_CLIPRECT_0_BR__BR_X_mask
);
724 SETfield(r700
->PA_SC_CLIPRECT_0_BR
.u32All
, y2
,
725 PA_SC_CLIPRECT_0_BR__BR_Y_shift
, PA_SC_CLIPRECT_0_BR__BR_Y_mask
);
727 r700
->PA_SC_CLIPRECT_1_TL
.u32All
= r700
->PA_SC_CLIPRECT_0_TL
.u32All
;
728 r700
->PA_SC_CLIPRECT_1_BR
.u32All
= r700
->PA_SC_CLIPRECT_0_BR
.u32All
;
729 r700
->PA_SC_CLIPRECT_2_TL
.u32All
= r700
->PA_SC_CLIPRECT_0_TL
.u32All
;
730 r700
->PA_SC_CLIPRECT_2_BR
.u32All
= r700
->PA_SC_CLIPRECT_0_BR
.u32All
;
731 r700
->PA_SC_CLIPRECT_3_TL
.u32All
= r700
->PA_SC_CLIPRECT_0_TL
.u32All
;
732 r700
->PA_SC_CLIPRECT_3_BR
.u32All
= r700
->PA_SC_CLIPRECT_0_BR
.u32All
;
734 /* more....2d clip */
735 SETbit(r700
->PA_SC_GENERIC_SCISSOR_TL
.u32All
, WINDOW_OFFSET_DISABLE_bit
);
736 SETfield(r700
->PA_SC_GENERIC_SCISSOR_TL
.u32All
, x1
,
737 PA_SC_GENERIC_SCISSOR_TL__TL_X_shift
, PA_SC_GENERIC_SCISSOR_TL__TL_X_mask
);
738 SETfield(r700
->PA_SC_GENERIC_SCISSOR_TL
.u32All
, y1
,
739 PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift
, PA_SC_GENERIC_SCISSOR_TL__TL_Y_mask
);
740 SETfield(r700
->PA_SC_GENERIC_SCISSOR_BR
.u32All
, x2
,
741 PA_SC_GENERIC_SCISSOR_BR__BR_X_shift
, PA_SC_GENERIC_SCISSOR_BR__BR_X_mask
);
742 SETfield(r700
->PA_SC_GENERIC_SCISSOR_BR
.u32All
, y2
,
743 PA_SC_GENERIC_SCISSOR_BR__BR_Y_shift
, PA_SC_GENERIC_SCISSOR_BR__BR_Y_mask
);
745 SETbit(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_TL
.u32All
, WINDOW_OFFSET_DISABLE_bit
);
746 SETfield(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_TL
.u32All
, x1
,
747 PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift
, PA_SC_VPORT_SCISSOR_0_TL__TL_X_mask
);
748 SETfield(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_TL
.u32All
, y1
,
749 PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift
, PA_SC_VPORT_SCISSOR_0_TL__TL_Y_mask
);
750 SETfield(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_BR
.u32All
, x2
,
751 PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift
, PA_SC_VPORT_SCISSOR_0_BR__BR_X_mask
);
752 SETfield(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_BR
.u32All
, y2
,
753 PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift
, PA_SC_VPORT_SCISSOR_0_BR__BR_Y_mask
);
755 r700
->viewport
[id
].PA_SC_VPORT_ZMIN_0
.u32All
= 0;
756 r700
->viewport
[id
].PA_SC_VPORT_ZMAX_0
.u32All
= 0x3F800000;
757 r700
->viewport
[id
].enabled
= GL_TRUE
;
760 void r700SetRenderTarget(context_t
*context
, int id
)
762 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
764 struct radeon_renderbuffer
*rrb
;
765 unsigned int nPitchInPixel
;
767 /* screen/window/view */
768 SETfield(r700
->CB_TARGET_MASK
.u32All
, 0xF, (4 * id
), TARGET0_ENABLE_mask
);
770 rrb
= radeon_get_colorbuffer(&context
->radeon
);
771 if (!rrb
|| !rrb
->bo
) {
772 fprintf(stderr
, "no rrb\n");
777 r700
->render_target
[id
].CB_COLOR0_BASE
.u32All
= context
->radeon
.state
.color
.draw_offset
;
779 nPitchInPixel
= rrb
->pitch
/rrb
->cpp
;
780 SETfield(r700
->render_target
[id
].CB_COLOR0_SIZE
.u32All
, (nPitchInPixel
/8)-1,
781 PITCH_TILE_MAX_shift
, PITCH_TILE_MAX_mask
);
782 SETfield(r700
->render_target
[id
].CB_COLOR0_SIZE
.u32All
, ( (nPitchInPixel
* context
->radeon
.radeonScreen
->driScreen
->fbHeight
)/64 )-1,
783 SLICE_TILE_MAX_shift
, SLICE_TILE_MAX_mask
);
784 r700
->render_target
[id
].CB_COLOR0_BASE
.u32All
= 0;
785 SETfield(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, ENDIAN_NONE
, ENDIAN_shift
, ENDIAN_mask
);
786 SETfield(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, ARRAY_LINEAR_GENERAL
,
787 CB_COLOR0_INFO__ARRAY_MODE_shift
, CB_COLOR0_INFO__ARRAY_MODE_mask
);
790 SETfield(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, COLOR_8_8_8_8
,
791 CB_COLOR0_INFO__FORMAT_shift
, CB_COLOR0_INFO__FORMAT_mask
);
792 SETfield(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, SWAP_ALT
, COMP_SWAP_shift
, COMP_SWAP_mask
);
796 SETfield(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, COLOR_5_6_5
,
797 CB_COLOR0_INFO__FORMAT_shift
, CB_COLOR0_INFO__FORMAT_mask
);
798 SETfield(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, SWAP_ALT_REV
,
799 COMP_SWAP_shift
, COMP_SWAP_mask
);
801 SETbit(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, SOURCE_FORMAT_bit
);
802 SETbit(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, BLEND_CLAMP_bit
);
803 SETfield(r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
, NUMBER_UNORM
, NUMBER_TYPE_shift
, NUMBER_TYPE_mask
);
805 CLEARfield(r700
->render_target
[id
].CB_BLEND0_CONTROL
.u32All
, COLOR_SRCBLEND_mask
); /* no dst blend */
806 CLEARfield(r700
->render_target
[id
].CB_BLEND0_CONTROL
.u32All
, ALPHA_SRCBLEND_mask
); /* no dst blend */
808 r700
->render_target
[id
].enabled
= GL_TRUE
;
811 void r700SetDepthTarget(context_t
*context
)
813 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
815 struct radeon_renderbuffer
*rrb
;
816 unsigned int nPitchInPixel
;
819 r700
->DB_DEPTH_SIZE
.u32All
= 0;
820 r700
->DB_DEPTH_BASE
.u32All
= 0;
821 r700
->DB_DEPTH_INFO
.u32All
= 0;
823 r700
->DB_DEPTH_CLEAR
.u32All
= 0x3F800000;
824 r700
->DB_DEPTH_VIEW
.u32All
= 0;
825 r700
->DB_RENDER_CONTROL
.u32All
= 0;
826 SETbit(r700
->DB_RENDER_CONTROL
.u32All
, STENCIL_COMPRESS_DISABLE_bit
);
827 SETbit(r700
->DB_RENDER_CONTROL
.u32All
, DEPTH_COMPRESS_DISABLE_bit
);
828 r700
->DB_RENDER_OVERRIDE
.u32All
= 0;
829 if (context
->radeon
.radeonScreen
->chip_family
< CHIP_FAMILY_RV770
)
830 SETbit(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_SHADER_Z_ORDER_bit
);
831 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIZ_ENABLE_shift
, FORCE_HIZ_ENABLE_mask
);
832 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIS_ENABLE0_shift
, FORCE_HIS_ENABLE0_mask
);
833 SETfield(r700
->DB_RENDER_OVERRIDE
.u32All
, FORCE_DISABLE
, FORCE_HIS_ENABLE1_shift
, FORCE_HIS_ENABLE1_mask
);
835 r700
->DB_ALPHA_TO_MASK
.u32All
= 0;
836 SETfield(r700
->DB_ALPHA_TO_MASK
.u32All
, 2, ALPHA_TO_MASK_OFFSET0_shift
, ALPHA_TO_MASK_OFFSET0_mask
);
837 SETfield(r700
->DB_ALPHA_TO_MASK
.u32All
, 2, ALPHA_TO_MASK_OFFSET1_shift
, ALPHA_TO_MASK_OFFSET1_mask
);
838 SETfield(r700
->DB_ALPHA_TO_MASK
.u32All
, 2, ALPHA_TO_MASK_OFFSET2_shift
, ALPHA_TO_MASK_OFFSET2_mask
);
839 SETfield(r700
->DB_ALPHA_TO_MASK
.u32All
, 2, ALPHA_TO_MASK_OFFSET3_shift
, ALPHA_TO_MASK_OFFSET3_mask
);
841 rrb
= radeon_get_depthbuffer(&context
->radeon
);
845 nPitchInPixel
= rrb
->pitch
/rrb
->cpp
;
847 SETfield(r700
->DB_DEPTH_SIZE
.u32All
, (nPitchInPixel
/8)-1,
848 PITCH_TILE_MAX_shift
, PITCH_TILE_MAX_mask
);
849 SETfield(r700
->DB_DEPTH_SIZE
.u32All
, ( (nPitchInPixel
* context
->radeon
.radeonScreen
->driScreen
->fbHeight
)/64 )-1,
850 SLICE_TILE_MAX_shift
, SLICE_TILE_MAX_mask
); /* size in pixel / 64 - 1 */
854 switch (GL_CONTEXT(context
)->Visual
.depthBits
)
858 SETfield(r700
->DB_DEPTH_INFO
.u32All
, DEPTH_8_24
,
859 DB_DEPTH_INFO__FORMAT_shift
, DB_DEPTH_INFO__FORMAT_mask
);
862 fprintf(stderr
, "Error: Unsupported depth %d... exiting\n",
863 GL_CONTEXT(context
)->Visual
.depthBits
);
869 SETfield(r700
->DB_DEPTH_INFO
.u32All
, DEPTH_16
,
870 DB_DEPTH_INFO__FORMAT_shift
, DB_DEPTH_INFO__FORMAT_mask
);
872 SETfield(r700
->DB_DEPTH_INFO
.u32All
, ARRAY_2D_TILED_THIN1
,
873 DB_DEPTH_INFO__ARRAY_MODE_shift
, DB_DEPTH_INFO__ARRAY_MODE_mask
);
874 /* 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. */
877 static void r700InitSQConfig(GLcontext
* ctx
)
879 context_t
*context
= R700_CONTEXT(ctx
);
880 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
894 int num_ps_stack_entries
;
895 int num_vs_stack_entries
;
896 int num_gs_stack_entries
;
897 int num_es_stack_entries
;
904 switch (context
->radeon
.radeonScreen
->chip_family
) {
905 case CHIP_FAMILY_R600
:
911 num_ps_threads
= 136;
915 num_ps_stack_entries
= 128;
916 num_vs_stack_entries
= 128;
917 num_gs_stack_entries
= 0;
918 num_es_stack_entries
= 0;
920 case CHIP_FAMILY_RV630
:
921 case CHIP_FAMILY_RV635
:
927 num_ps_threads
= 144;
931 num_ps_stack_entries
= 40;
932 num_vs_stack_entries
= 40;
933 num_gs_stack_entries
= 32;
934 num_es_stack_entries
= 16;
936 case CHIP_FAMILY_RV610
:
937 case CHIP_FAMILY_RV620
:
938 case CHIP_FAMILY_RS780
:
945 num_ps_threads
= 136;
949 num_ps_stack_entries
= 40;
950 num_vs_stack_entries
= 40;
951 num_gs_stack_entries
= 32;
952 num_es_stack_entries
= 16;
954 case CHIP_FAMILY_RV670
:
960 num_ps_threads
= 136;
964 num_ps_stack_entries
= 40;
965 num_vs_stack_entries
= 40;
966 num_gs_stack_entries
= 32;
967 num_es_stack_entries
= 16;
969 case CHIP_FAMILY_RV770
:
975 num_ps_threads
= 188;
979 num_ps_stack_entries
= 256;
980 num_vs_stack_entries
= 256;
981 num_gs_stack_entries
= 0;
982 num_es_stack_entries
= 0;
984 case CHIP_FAMILY_RV730
:
985 case CHIP_FAMILY_RV740
:
991 num_ps_threads
= 188;
995 num_ps_stack_entries
= 128;
996 num_vs_stack_entries
= 128;
997 num_gs_stack_entries
= 0;
998 num_es_stack_entries
= 0;
1000 case CHIP_FAMILY_RV710
:
1006 num_ps_threads
= 144;
1007 num_vs_threads
= 48;
1010 num_ps_stack_entries
= 128;
1011 num_vs_stack_entries
= 128;
1012 num_gs_stack_entries
= 0;
1013 num_es_stack_entries
= 0;
1017 r700
->sq_config
.SQ_CONFIG
.u32All
= 0;
1018 if ((context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV610
) ||
1019 (context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV620
) ||
1020 (context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RS780
) ||
1021 (context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV710
))
1022 CLEARbit(r700
->sq_config
.SQ_CONFIG
.u32All
, VC_ENABLE_bit
);
1024 SETbit(r700
->sq_config
.SQ_CONFIG
.u32All
, VC_ENABLE_bit
);
1025 SETbit(r700
->sq_config
.SQ_CONFIG
.u32All
, DX9_CONSTS_bit
);
1026 SETbit(r700
->sq_config
.SQ_CONFIG
.u32All
, ALU_INST_PREFER_VECTOR_bit
);
1027 SETfield(r700
->sq_config
.SQ_CONFIG
.u32All
, ps_prio
, PS_PRIO_shift
, PS_PRIO_mask
);
1028 SETfield(r700
->sq_config
.SQ_CONFIG
.u32All
, ps_prio
, VS_PRIO_shift
, VS_PRIO_mask
);
1029 SETfield(r700
->sq_config
.SQ_CONFIG
.u32All
, ps_prio
, GS_PRIO_shift
, GS_PRIO_mask
);
1030 SETfield(r700
->sq_config
.SQ_CONFIG
.u32All
, ps_prio
, ES_PRIO_shift
, ES_PRIO_mask
);
1032 r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_1
.u32All
= 0;
1033 SETfield(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_1
.u32All
, num_ps_gprs
, NUM_PS_GPRS_shift
, NUM_PS_GPRS_mask
);
1034 SETfield(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_1
.u32All
, num_vs_gprs
, NUM_VS_GPRS_shift
, NUM_VS_GPRS_mask
);
1035 SETfield(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_1
.u32All
, num_temp_gprs
,
1036 NUM_CLAUSE_TEMP_GPRS_shift
, NUM_CLAUSE_TEMP_GPRS_mask
);
1038 r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_2
.u32All
= 0;
1039 SETfield(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_2
.u32All
, num_gs_gprs
, NUM_GS_GPRS_shift
, NUM_GS_GPRS_mask
);
1040 SETfield(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_2
.u32All
, num_es_gprs
, NUM_ES_GPRS_shift
, NUM_ES_GPRS_mask
);
1042 r700
->sq_config
.SQ_THREAD_RESOURCE_MGMT
.u32All
= 0;
1043 SETfield(r700
->sq_config
.SQ_THREAD_RESOURCE_MGMT
.u32All
, num_ps_threads
,
1044 NUM_PS_THREADS_shift
, NUM_PS_THREADS_mask
);
1045 SETfield(r700
->sq_config
.SQ_THREAD_RESOURCE_MGMT
.u32All
, num_vs_threads
,
1046 NUM_VS_THREADS_shift
, NUM_VS_THREADS_mask
);
1047 SETfield(r700
->sq_config
.SQ_THREAD_RESOURCE_MGMT
.u32All
, num_gs_threads
,
1048 NUM_GS_THREADS_shift
, NUM_GS_THREADS_mask
);
1049 SETfield(r700
->sq_config
.SQ_THREAD_RESOURCE_MGMT
.u32All
, num_es_threads
,
1050 NUM_ES_THREADS_shift
, NUM_ES_THREADS_mask
);
1052 r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_1
.u32All
= 0;
1053 SETfield(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_1
.u32All
, num_ps_stack_entries
,
1054 NUM_PS_STACK_ENTRIES_shift
, NUM_PS_STACK_ENTRIES_mask
);
1055 SETfield(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_1
.u32All
, num_vs_stack_entries
,
1056 NUM_VS_STACK_ENTRIES_shift
, NUM_VS_STACK_ENTRIES_mask
);
1058 r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_2
.u32All
= 0;
1059 SETfield(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_2
.u32All
, num_gs_stack_entries
,
1060 NUM_GS_STACK_ENTRIES_shift
, NUM_GS_STACK_ENTRIES_mask
);
1061 SETfield(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_2
.u32All
, num_es_stack_entries
,
1062 NUM_ES_STACK_ENTRIES_shift
, NUM_ES_STACK_ENTRIES_mask
);
1067 * Calculate initial hardware state and register state functions.
1068 * Assumes that the command buffer and state atoms have been
1069 * initialized already.
1071 void r700InitState(GLcontext
* ctx
) //-------------------
1073 context_t
*context
= R700_CONTEXT(ctx
);
1075 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
1077 r700
->TA_CNTL_AUX
.u32All
= 0;
1078 SETfield(r700
->TA_CNTL_AUX
.u32All
, 28, TD_FIFO_CREDIT_shift
, TD_FIFO_CREDIT_mask
);
1079 r700
->VC_ENHANCE
.u32All
= 0;
1080 r700
->DB_WATERMARKS
.u32All
= 0;
1081 SETfield(r700
->DB_WATERMARKS
.u32All
, 4, DEPTH_FREE_shift
, DEPTH_FREE_mask
);
1082 SETfield(r700
->DB_WATERMARKS
.u32All
, 16, DEPTH_FLUSH_shift
, DEPTH_FLUSH_mask
);
1083 SETfield(r700
->DB_WATERMARKS
.u32All
, 0, FORCE_SUMMARIZE_shift
, FORCE_SUMMARIZE_mask
);
1084 SETfield(r700
->DB_WATERMARKS
.u32All
, 4, DEPTH_PENDING_FREE_shift
, DEPTH_PENDING_FREE_mask
);
1085 r700
->SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
.u32All
= 0;
1086 if (context
->radeon
.radeonScreen
->chip_family
< CHIP_FAMILY_RV770
) {
1087 SETfield(r700
->TA_CNTL_AUX
.u32All
, 3, GRADIENT_CREDIT_shift
, GRADIENT_CREDIT_mask
);
1088 r700
->DB_DEBUG
.u32All
= 0x82000000;
1089 SETfield(r700
->DB_WATERMARKS
.u32All
, 16, DEPTH_CACHELINE_FREE_shift
, DEPTH_CACHELINE_FREE_mask
);
1091 SETfield(r700
->TA_CNTL_AUX
.u32All
, 2, GRADIENT_CREDIT_shift
, GRADIENT_CREDIT_mask
);
1092 SETfield(r700
->DB_WATERMARKS
.u32All
, 4, DEPTH_CACHELINE_FREE_shift
, DEPTH_CACHELINE_FREE_mask
);
1093 SETbit(r700
->SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
.u32All
, VS_PC_LIMIT_ENABLE_bit
);
1096 /* Turn off vgt reuse */
1097 r700
->VGT_REUSE_OFF
.u32All
= 0;
1098 SETbit(r700
->VGT_REUSE_OFF
.u32All
, REUSE_OFF_bit
);
1100 /* Specify offsetting and clamp values for vertices */
1101 r700
->VGT_MAX_VTX_INDX
.u32All
= 0xFFFFFF;
1102 r700
->VGT_MIN_VTX_INDX
.u32All
= 0;
1103 r700
->VGT_INDX_OFFSET
.u32All
= 0;
1105 /* Specify the number of instances */
1106 r700
->VGT_DMA_NUM_INSTANCES
.u32All
= 1;
1108 /* not alpha blend */
1109 CLEARfield(r700
->SX_ALPHA_TEST_CONTROL
.u32All
, ALPHA_FUNC_mask
);
1110 CLEARbit(r700
->SX_ALPHA_TEST_CONTROL
.u32All
, ALPHA_TEST_ENABLE_bit
);
1112 /* default shader connections. */
1113 r700
->SPI_VS_OUT_ID_0
.u32All
= 0x03020100;
1114 r700
->SPI_VS_OUT_ID_1
.u32All
= 0x07060504;
1116 r700
->SPI_PS_INPUT_CNTL_0
.u32All
= 0x00000800;
1117 r700
->SPI_PS_INPUT_CNTL_1
.u32All
= 0x00000801;
1118 r700
->SPI_PS_INPUT_CNTL_2
.u32All
= 0x00000802;
1120 r700
->SPI_THREAD_GROUPING
.u32All
= 0;
1121 if (context
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV770
)
1122 SETfield(r700
->SPI_THREAD_GROUPING
.u32All
, 1, PS_GROUPING_shift
, PS_GROUPING_mask
);
1124 r700SetLogicOpState(ctx
);
1125 CLEARbit(r700
->CB_COLOR_CONTROL
.u32All
, PER_MRT_BLEND_bit
);
1127 r700
->DB_SHADER_CONTROL
.u32All
= 0;
1128 SETbit(r700
->DB_SHADER_CONTROL
.u32All
, DUAL_EXPORT_ENABLE_bit
);
1130 /* Set up the culling control register */
1131 SETfield(r700
->PA_SU_SC_MODE_CNTL
.u32All
, X_DRAW_TRIANGLES
,
1132 POLYMODE_FRONT_PTYPE_shift
, POLYMODE_FRONT_PTYPE_mask
);
1133 SETfield(r700
->PA_SU_SC_MODE_CNTL
.u32All
, X_DRAW_TRIANGLES
,
1134 POLYMODE_BACK_PTYPE_shift
, POLYMODE_BACK_PTYPE_mask
);
1137 r700
->PA_SC_SCREEN_SCISSOR_TL
.u32All
= 0x0;
1139 SETfield(r700
->PA_SC_SCREEN_SCISSOR_BR
.u32All
,
1140 ((RADEONDRIPtr
)(context
->radeon
.radeonScreen
->driScreen
->pDevPriv
))->width
,
1141 PA_SC_SCREEN_SCISSOR_BR__BR_X_shift
, PA_SC_SCREEN_SCISSOR_BR__BR_X_mask
);
1142 SETfield(r700
->PA_SC_SCREEN_SCISSOR_BR
.u32All
,
1143 ((RADEONDRIPtr
)(context
->radeon
.radeonScreen
->driScreen
->pDevPriv
))->height
,
1144 PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift
, PA_SC_SCREEN_SCISSOR_BR__BR_Y_mask
);
1146 /* 4 clip rectangles */ /* TODO : set these clip rects according to context->currentDraw->numClipRects */
1147 r700
->PA_SC_CLIPRECT_RULE
.u32All
= 0;
1148 SETfield(r700
->PA_SC_CLIPRECT_RULE
.u32All
, CLIP_RULE_mask
, CLIP_RULE_shift
, CLIP_RULE_mask
);
1150 if (context
->radeon
.radeonScreen
->chip_family
< CHIP_FAMILY_RV770
)
1151 r700
->PA_SC_EDGERULE
.u32All
= 0;
1153 r700
->PA_SC_EDGERULE
.u32All
= 0xAAAAAAAA;
1155 if (context
->radeon
.radeonScreen
->chip_family
< CHIP_FAMILY_RV770
) {
1156 r700
->PA_SC_MODE_CNTL
.u32All
= 0;
1157 SETbit(r700
->PA_SC_MODE_CNTL
.u32All
, WALK_ORDER_ENABLE_bit
);
1158 SETbit(r700
->PA_SC_MODE_CNTL
.u32All
, FORCE_EOV_CNTDWN_ENABLE_bit
);
1160 r700
->PA_SC_MODE_CNTL
.u32All
= 0x00500000;
1161 SETbit(r700
->PA_SC_MODE_CNTL
.u32All
, FORCE_EOV_REZ_ENABLE_bit
);
1162 SETbit(r700
->PA_SC_MODE_CNTL
.u32All
, FORCE_EOV_CNTDWN_ENABLE_bit
);
1165 /* Do scale XY and Z by 1/W0. */
1166 r700
->bEnablePerspective
= GL_TRUE
;
1167 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_XY_FMT_bit
);
1168 CLEARbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_Z_FMT_bit
);
1169 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VTX_W0_FMT_bit
);
1171 /* Enable viewport scaling for all three axis */
1172 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_X_SCALE_ENA_bit
);
1173 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_X_OFFSET_ENA_bit
);
1174 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Y_SCALE_ENA_bit
);
1175 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Y_OFFSET_ENA_bit
);
1176 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Z_SCALE_ENA_bit
);
1177 SETbit(r700
->PA_CL_VTE_CNTL
.u32All
, VPORT_Z_OFFSET_ENA_bit
);
1179 /* Set up point sizes and min/max values */
1180 SETfield(r700
->PA_SU_POINT_SIZE
.u32All
, 0x8,
1181 PA_SU_POINT_SIZE__HEIGHT_shift
, PA_SU_POINT_SIZE__HEIGHT_mask
);
1182 SETfield(r700
->PA_SU_POINT_SIZE
.u32All
, 0x8,
1183 PA_SU_POINT_SIZE__WIDTH_shift
, PA_SU_POINT_SIZE__WIDTH_mask
);
1184 CLEARfield(r700
->PA_SU_POINT_MINMAX
.u32All
, MIN_SIZE_mask
);
1185 SETfield(r700
->PA_SU_POINT_MINMAX
.u32All
, 0x8000, MAX_SIZE_shift
, MAX_SIZE_mask
);
1187 /* Set up line control */
1188 SETfield(r700
->PA_SU_LINE_CNTL
.u32All
, 0x8,
1189 PA_SU_LINE_CNTL__WIDTH_shift
, PA_SU_LINE_CNTL__WIDTH_mask
);
1191 r700
->PA_SC_LINE_CNTL
.u32All
= 0;
1192 CLEARbit(r700
->PA_SC_LINE_CNTL
.u32All
, EXPAND_LINE_WIDTH_bit
);
1193 SETbit(r700
->PA_SC_LINE_CNTL
.u32All
, LAST_PIXEL_bit
);
1195 /* Set up vertex control */
1196 r700
->PA_SU_VTX_CNTL
.u32All
= 0;
1197 CLEARfield(r700
->PA_SU_VTX_CNTL
.u32All
, QUANT_MODE_mask
);
1198 SETbit(r700
->PA_SU_VTX_CNTL
.u32All
, PIX_CENTER_bit
);
1199 SETfield(r700
->PA_SU_VTX_CNTL
.u32All
, X_ROUND_TO_EVEN
,
1200 PA_SU_VTX_CNTL__ROUND_MODE_shift
, PA_SU_VTX_CNTL__ROUND_MODE_mask
);
1202 /* to 1.0 = no guard band */
1203 r700
->PA_CL_GB_VERT_CLIP_ADJ
.u32All
= 0x3F800000; /* 1.0 */
1204 r700
->PA_CL_GB_VERT_DISC_ADJ
.u32All
= 0x3F800000;
1205 r700
->PA_CL_GB_HORZ_CLIP_ADJ
.u32All
= 0x3F800000;
1206 r700
->PA_CL_GB_HORZ_DISC_ADJ
.u32All
= 0x3F800000;
1209 r700
->CB_CLEAR_RED_R6XX
.f32All
= 1.0; //r6xx only
1210 r700
->CB_CLEAR_GREEN_R6XX
.f32All
= 0.0; //r6xx only
1211 r700
->CB_CLEAR_BLUE_R6XX
.f32All
= 1.0; //r6xx only
1212 r700
->CB_CLEAR_ALPHA_R6XX
.f32All
= 1.0; //r6xx only
1213 r700
->CB_FOG_RED_R6XX
.u32All
= 0; //r6xx only
1214 r700
->CB_FOG_GREEN_R6XX
.u32All
= 0; //r6xx only
1215 r700
->CB_FOG_BLUE_R6XX
.u32All
= 0; //r6xx only
1217 r700
->CB_BLEND_RED
.u32All
= 0;
1218 r700
->CB_BLEND_GREEN
.u32All
= 0;
1219 r700
->CB_BLEND_BLUE
.u32All
= 0;
1220 r700
->CB_BLEND_ALPHA
.u32All
= 0;
1222 r700
->CB_BLEND_CONTROL
.u32All
= 0;
1224 /* Disable color compares */
1225 SETfield(r700
->CB_CLRCMP_CONTROL
.u32All
, CLRCMP_DRAW_ALWAYS
,
1226 CLRCMP_FCN_SRC_shift
, CLRCMP_FCN_SRC_mask
);
1227 SETfield(r700
->CB_CLRCMP_CONTROL
.u32All
, CLRCMP_DRAW_ALWAYS
,
1228 CLRCMP_FCN_DST_shift
, CLRCMP_FCN_DST_mask
);
1229 SETfield(r700
->CB_CLRCMP_CONTROL
.u32All
, CLRCMP_SEL_SRC
,
1230 CLRCMP_FCN_SEL_shift
, CLRCMP_FCN_SEL_mask
);
1232 /* Zero out source */
1233 r700
->CB_CLRCMP_SRC
.u32All
= 0x00000000;
1235 /* Put a compare color in for error checking */
1236 r700
->CB_CLRCMP_DST
.u32All
= 0x000000FF;
1238 /* Set up color compare mask */
1239 r700
->CB_CLRCMP_MSK
.u32All
= 0xFFFFFFFF;
1241 /* default color mask */
1242 SETfield(r700
->CB_SHADER_MASK
.u32All
, 0xF, OUTPUT0_ENABLE_shift
, OUTPUT0_ENABLE_mask
);
1244 /* Enable all samples for multi-sample anti-aliasing */
1245 r700
->PA_SC_AA_MASK
.u32All
= 0xFFFFFFFF;
1247 r700
->PA_SC_AA_CONFIG
.u32All
= 0;
1249 r700
->SX_MISC
.u32All
= 0;
1251 r700InitSQConfig(ctx
);
1254 void r700InitStateFuncs(struct dd_function_table
*functions
) //-----------------
1256 functions
->UpdateState
= r700InvalidateState
;
1257 functions
->AlphaFunc
= r700AlphaFunc
;
1258 functions
->BlendColor
= r700BlendColor
;
1259 functions
->BlendEquationSeparate
= r700BlendEquationSeparate
;
1260 functions
->BlendFuncSeparate
= r700BlendFuncSeparate
;
1261 functions
->Enable
= r700Enable
;
1262 functions
->ColorMask
= r700ColorMask
;
1263 functions
->DepthFunc
= r700DepthFunc
;
1264 functions
->DepthMask
= r700DepthMask
;
1265 functions
->CullFace
= r700CullFace
;
1266 functions
->Fogfv
= r700Fogfv
;
1267 functions
->FrontFace
= r700FrontFace
;
1268 functions
->ShadeModel
= r700ShadeModel
;
1269 functions
->LogicOpcode
= r700LogicOpcode
;
1271 /* ARB_point_parameters */
1272 functions
->PointParameterfv
= r700PointParameter
;
1274 /* Stencil related */
1275 functions
->StencilFuncSeparate
= r700StencilFuncSeparate
;
1276 functions
->StencilMaskSeparate
= r700StencilMaskSeparate
;
1277 functions
->StencilOpSeparate
= r700StencilOpSeparate
;
1279 /* Viewport related */
1280 functions
->Viewport
= r700Viewport
;
1281 functions
->DepthRange
= r700DepthRange
;
1282 functions
->PointSize
= r700PointSize
;
1283 functions
->LineWidth
= r700LineWidth
;
1284 functions
->LineStipple
= r700LineStipple
;
1286 functions
->PolygonOffset
= r700PolygonOffset
;
1287 functions
->PolygonMode
= r700PolygonMode
;
1289 functions
->RenderMode
= r700RenderMode
;
1291 functions
->ClipPlane
= r700ClipPlane
;
1293 functions
->Scissor
= radeonScissor
;
1295 functions
->DrawBuffer
= radeonDrawBuffer
;
1296 functions
->ReadBuffer
= radeonReadBuffer
;