r600 : add read port allocation for uniform;
authorRichard Li <richardradeon@gmail.com>
Sun, 29 Nov 2009 17:12:19 +0000 (12:12 -0500)
committerRichard Li <richardradeon@gmail.com>
Sun, 29 Nov 2009 17:33:14 +0000 (12:33 -0500)
       mapping ps input based on vs output;
       fix bugs including constants updating for vs.

src/mesa/drivers/dri/r600/r700_assembler.c
src/mesa/drivers/dri/r600/r700_fragprog.c
src/mesa/drivers/dri/r600/r700_fragprog.h
src/mesa/drivers/dri/r600/r700_vertprog.c

index ba97d3e073756bdb0d0aa8950389e36171c197fa..309c90fdd0c45704760b17c107136fd447367b69 100644 (file)
@@ -1038,7 +1038,8 @@ GLboolean checkop2(r700_AssemblerBase* pAsm)
 
     checkop_init(pAsm);
 
-    if( (pILInst->SrcReg[0].File == PROGRAM_CONSTANT)    ||
+    if( (pILInst->SrcReg[0].File == PROGRAM_UNIFORM)     || 
+        (pILInst->SrcReg[0].File == PROGRAM_CONSTANT)    ||
         (pILInst->SrcReg[0].File == PROGRAM_LOCAL_PARAM) ||
         (pILInst->SrcReg[0].File == PROGRAM_ENV_PARAM)   ||
         (pILInst->SrcReg[0].File == PROGRAM_STATE_VAR) )
@@ -1049,7 +1050,8 @@ GLboolean checkop2(r700_AssemblerBase* pAsm)
     {
         bSrcConst[0] = GL_FALSE;
     }
-    if( (pILInst->SrcReg[1].File == PROGRAM_CONSTANT)    ||
+    if( (pILInst->SrcReg[1].File == PROGRAM_UNIFORM)     || 
+        (pILInst->SrcReg[1].File == PROGRAM_CONSTANT)    ||
         (pILInst->SrcReg[1].File == PROGRAM_LOCAL_PARAM) ||
         (pILInst->SrcReg[1].File == PROGRAM_ENV_PARAM)   ||
         (pILInst->SrcReg[1].File == PROGRAM_STATE_VAR) )
@@ -1082,7 +1084,8 @@ GLboolean checkop3(r700_AssemblerBase* pAsm)
 
     checkop_init(pAsm);
 
-    if( (pILInst->SrcReg[0].File == PROGRAM_CONSTANT)    ||
+    if( (pILInst->SrcReg[0].File == PROGRAM_UNIFORM)     || 
+        (pILInst->SrcReg[0].File == PROGRAM_CONSTANT)    ||
         (pILInst->SrcReg[0].File == PROGRAM_LOCAL_PARAM) ||
         (pILInst->SrcReg[0].File == PROGRAM_ENV_PARAM)   ||
         (pILInst->SrcReg[0].File == PROGRAM_STATE_VAR) )
@@ -1093,7 +1096,8 @@ GLboolean checkop3(r700_AssemblerBase* pAsm)
     {
         bSrcConst[0] = GL_FALSE;
     }
-    if( (pILInst->SrcReg[1].File == PROGRAM_CONSTANT)    ||
+    if( (pILInst->SrcReg[1].File == PROGRAM_UNIFORM)     || 
+        (pILInst->SrcReg[1].File == PROGRAM_CONSTANT)    ||
         (pILInst->SrcReg[1].File == PROGRAM_LOCAL_PARAM) ||
         (pILInst->SrcReg[1].File == PROGRAM_ENV_PARAM)   ||
         (pILInst->SrcReg[1].File == PROGRAM_STATE_VAR) )
@@ -1104,7 +1108,8 @@ GLboolean checkop3(r700_AssemblerBase* pAsm)
     {
         bSrcConst[1] = GL_FALSE;
     }
-    if( (pILInst->SrcReg[2].File == PROGRAM_CONSTANT)    ||
+    if( (pILInst->SrcReg[2].File == PROGRAM_UNIFORM)     || 
+        (pILInst->SrcReg[2].File == PROGRAM_CONSTANT)    ||
         (pILInst->SrcReg[2].File == PROGRAM_LOCAL_PARAM) ||
         (pILInst->SrcReg[2].File == PROGRAM_ENV_PARAM)   ||
         (pILInst->SrcReg[2].File == PROGRAM_STATE_VAR) )
@@ -1218,7 +1223,7 @@ GLboolean assemble_src(r700_AssemblerBase *pAsm,
             pAsm->S[fld].src.reg   = pILInst->SrcReg[src].Index;
             break;      
         case PROGRAM_INPUT:
-            setaddrmode_PVSSRC(&(pAsm->S[fld].src), ADDR_ABSOLUTE);
+            setaddrmode_PVSSRC(&(pAsm->S[fld].src), ADDR_ABSOLUTE); 
             pAsm->S[fld].src.rtype = SRC_REG_INPUT;
             switch (pAsm->currentShaderType)
             {
@@ -1346,6 +1351,7 @@ GLboolean tex_src(r700_AssemblerBase *pAsm)
     else
     {
     switch (pILInst->SrcReg[0].File) {
+        case PROGRAM_UNIFORM: 
         case PROGRAM_CONSTANT:
         case PROGRAM_LOCAL_PARAM:
         case PROGRAM_ENV_PARAM:
@@ -2117,7 +2123,7 @@ GLboolean check_vector(r700_AssemblerBase* pAsm,
         if( is_gpr(sel) ) 
         {
             if( GL_FALSE == cycle_for_vector_bank_swizzle(bank_swizzle, src, &cycle) )
-            {
+            {             
                 return GL_FALSE;
             }
 
@@ -2129,7 +2135,7 @@ GLboolean check_vector(r700_AssemblerBase* pAsm,
             else 
             {
                 if( GL_FALSE == reserve_gpr(pAsm, sel, chan, cycle) )
-                {
+                {                    
                     return GL_FALSE;
                 }
             }
@@ -2141,7 +2147,7 @@ GLboolean check_vector(r700_AssemblerBase* pAsm,
             if( is_cfile(sel) ) 
             {        
                 if( GL_FALSE == reserve_cfile(pAsm, sel, chan) )
-                {
+                {                    
                     return GL_FALSE;
                 }
             }
@@ -2244,7 +2250,7 @@ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm)
                                          current_source_index,
                                          pcurrent_source, 
                                          scalar_channel_index) )     
-        {
+        {            
             return GL_FALSE;
         }
    
@@ -2258,7 +2264,7 @@ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm)
                                              current_source_index,
                                              pcurrent_source, 
                                              scalar_channel_index) ) 
-            {
+            {                
                 return GL_FALSE;
             }
         }
@@ -2287,7 +2293,7 @@ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm)
             alu_instruction_ptr->m_Word1.f.dst_gpr  = pAsm->D.dst.reg;
         }
         else 
-        {
+        {            
             radeon_error("Only temp destination registers supported for ALU dest regs.\n");
             return GL_FALSE;
         }
@@ -2401,7 +2407,7 @@ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm)
         }
 
         if(GL_FALSE == add_alu_instruction(pAsm, alu_instruction_ptr, contiguous_slots_needed) )
-        {
+        {            
             return GL_FALSE;
         }
 
@@ -2412,15 +2418,15 @@ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm)
         if (is_single_scalar_operation) 
         {
             if(GL_FALSE == check_scalar(pAsm, alu_instruction_ptr) )
-            {
+            {                
                 return GL_FALSE;
             }
         }
         else 
         {
             if(GL_FALSE == check_vector(pAsm, alu_instruction_ptr) )
-            {
-                return 1;
+            {                
+                return GL_FALSE; 
             }
         }
 
@@ -2667,7 +2673,7 @@ GLboolean assemble_alu_instruction2(r700_AssemblerBase *pAsm)
         {
             if(GL_FALSE == check_vector(pAsm, alu_instruction_ptr) )
             {
-                return 1;
+                return GL_FALSE; 
             }
         }
 
@@ -3642,6 +3648,7 @@ GLboolean assemble_LRP(r700_AssemblerBase *pAsm)
     {
         return GL_FALSE;
     }
+
     if( GL_FALSE == assemble_src(pAsm, 2, -1) ) 
     {
         return GL_FALSE;
@@ -4598,6 +4605,7 @@ GLboolean assemble_TEX(r700_AssemblerBase *pAsm)
     
     switch (pAsm->pILInst[pAsm->uiCurInst].SrcReg[0].File)
     {
+    case PROGRAM_UNIFORM: 
     case PROGRAM_CONSTANT:
     case PROGRAM_LOCAL_PARAM:
     case PROGRAM_ENV_PARAM:
@@ -6867,7 +6875,7 @@ GLboolean Process_Vertex_Exports(r700_AssemblerBase *pR700AsmCode,
             export_starting_index++;
                }
        }
-
+    
     for(i=VERT_RESULT_VAR0; i<VERT_RESULT_MAX; i++)
        {
         unBit = 1 << i;
@@ -6879,7 +6887,7 @@ GLboolean Process_Vertex_Exports(r700_AssemblerBase *pR700AsmCode,
                                           1, 
                                           pR700AsmCode->ucVP_OutputMap[i],
                                           GL_FALSE) )
-            {
+            {                
                 return GL_FALSE;
             }
 
index 21ac46e7b88323a8b27018d654915b65e56e8463..e9ef6c869530a749d79da13a5dbe76ff45c4dd2d 100644 (file)
 
 //TODO : Validate FP input with VP output.
 void Map_Fragment_Program(r700_AssemblerBase         *pAsm,
-                                                 struct gl_fragment_program *mesa_fp)
+                                                 struct gl_fragment_program *mesa_fp,
+                          GLcontext *ctx) 
 {
        unsigned int unBit;
     unsigned int i;
     GLuint       ui;
 
+    /* match fp inputs with vp exports. */
+    struct r700_vertex_program_cont *vpc =
+                      (struct r700_vertex_program_cont *)ctx->VertexProgram._Current;
+    GLbitfield OutputsWritten = vpc->mesa_program.Base.OutputsWritten;
+    
        pAsm->number_used_registers = 0;
 
 //Input mapping : mesa_fp->Base.InputsRead set the flag, set in 
@@ -61,41 +67,41 @@ void Map_Fragment_Program(r700_AssemblerBase         *pAsm,
                pAsm->uiFP_AttributeMap[FRAG_ATTRIB_WPOS] = pAsm->number_used_registers++;
        }
 
-       unBit = 1 << FRAG_ATTRIB_COL0;
-       if(mesa_fp->Base.InputsRead & unBit)
+    unBit = 1 << VERT_RESULT_COL0;
+       if(OutputsWritten & unBit)
        {
                pAsm->uiFP_AttributeMap[FRAG_ATTRIB_COL0] = pAsm->number_used_registers++;
        }
 
-       unBit = 1 << FRAG_ATTRIB_COL1;
-       if(mesa_fp->Base.InputsRead & unBit)
+       unBit = 1 << VERT_RESULT_COL1;
+       if(OutputsWritten & unBit)
        {
                pAsm->uiFP_AttributeMap[FRAG_ATTRIB_COL1] = pAsm->number_used_registers++;
        }
 
-    unBit = 1 << FRAG_ATTRIB_FOGC;
-    if(mesa_fp->Base.InputsRead & unBit)
+    unBit = 1 << VERT_RESULT_FOGC;
+    if(OutputsWritten & unBit)
     {
-            pAsm->uiFP_AttributeMap[FRAG_ATTRIB_FOGC] = pAsm->number_used_registers++;
+        pAsm->uiFP_AttributeMap[FRAG_ATTRIB_FOGC] = pAsm->number_used_registers++;
     }
 
        for(i=0; i<8; i++)
        {
-               unBit = 1 << (FRAG_ATTRIB_TEX0 + i);
-               if(mesa_fp->Base.InputsRead & unBit)
+               unBit = 1 << (VERT_RESULT_TEX0 + i);
+               if(OutputsWritten & unBit)
                {
                        pAsm->uiFP_AttributeMap[FRAG_ATTRIB_TEX0 + i] = pAsm->number_used_registers++;
                }
        }
 
-/* order has been taken care of */
+/* order has been taken care of */ 
 #if 1
-    for(i=FRAG_ATTRIB_VAR0; i<FRAG_ATTRIB_MAX; i++)
-    {
+    for(i=VERT_RESULT_VAR0; i<VERT_RESULT_MAX; i++)
+       {
         unBit = 1 << i;
-        if(mesa_fp->Base.InputsRead & unBit)
+        if(OutputsWritten & unBit)
                {
-            pAsm->uiFP_AttributeMap[i] = pAsm->number_used_registers++;
+            pAsm->uiFP_AttributeMap[i-VERT_RESULT_VAR0+FRAG_ATTRIB_VAR0] = pAsm->number_used_registers++;
         }
     }
 #else
@@ -291,7 +297,8 @@ GLboolean Find_Instruction_Dependencies_fp(struct r700_fragment_program *fp,
 }
 
 GLboolean r700TranslateFragmentShader(struct r700_fragment_program *fp,
-                                                            struct gl_fragment_program   *mesa_fp)
+                                                            struct gl_fragment_program   *mesa_fp,
+                                 GLcontext *ctx) 
 {
        GLuint    number_of_colors_exported;
        GLboolean z_enabled = GL_FALSE;
@@ -299,7 +306,7 @@ GLboolean r700TranslateFragmentShader(struct r700_fragment_program *fp,
 
     //Init_Program
        Init_r700_AssemblerBase( SPT_FP, &(fp->r700AsmCode), &(fp->r700Shader) );
-       Map_Fragment_Program(&(fp->r700AsmCode), mesa_fp);
+       Map_Fragment_Program(&(fp->r700AsmCode), mesa_fp, ctx); 
 
     if( GL_FALSE == Find_Instruction_Dependencies_fp(fp, mesa_fp) )
        {
@@ -366,7 +373,7 @@ void r700SelectFragmentShader(GLcontext *ctx)
     }
 
     if (GL_FALSE == fp->translated)
-           r700TranslateFragmentShader(fp, &(fp->mesa_program));
+           r700TranslateFragmentShader(fp, &(fp->mesa_program), ctx); 
 }
 
 void * r700GetActiveFpShaderBo(GLcontext * ctx)
@@ -460,6 +467,9 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
              EXPORT_MODE_shift, EXPORT_MODE_mask);
 
     // emit ps input map
+    struct r700_vertex_program_cont *vpc =
+                      (struct r700_vertex_program_cont *)ctx->VertexProgram._Current;
+    GLbitfield OutputsWritten = vpc->mesa_program.Base.OutputsWritten;
     unBit = 1 << FRAG_ATTRIB_WPOS;
     if(mesa_fp->Base.InputsRead & unBit)
     {
@@ -473,8 +483,8 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
                     CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
     }
 
-    unBit = 1 << FRAG_ATTRIB_COL0;
-    if(mesa_fp->Base.InputsRead & unBit)
+    unBit = 1 << VERT_RESULT_COL0;
+    if(OutputsWritten & unBit)
     {
            ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_COL0];
            SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
@@ -486,8 +496,8 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
                    CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
     }
 
-    unBit = 1 << FRAG_ATTRIB_COL1;
-    if(mesa_fp->Base.InputsRead & unBit)
+    unBit = 1 << VERT_RESULT_COL1;
+    if(OutputsWritten & unBit)
     {
            ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_COL1];
            SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
@@ -499,8 +509,8 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
                    CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
     }
 
-    unBit = 1 << FRAG_ATTRIB_FOGC;
-    if(mesa_fp->Base.InputsRead & unBit)
+    unBit = 1 << VERT_RESULT_FOGC;
+    if(OutputsWritten & unBit)
     {
             ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_FOGC];
             SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
@@ -514,8 +524,8 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
 
     for(i=0; i<8; i++)
     {
-           unBit = 1 << (FRAG_ATTRIB_TEX0 + i);
-           if(mesa_fp->Base.InputsRead & unBit)
+           unBit = 1 << (VERT_RESULT_TEX0 + i);
+           if(OutputsWritten & unBit)
            {
                    ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_TEX0 + i];
                    SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
@@ -525,12 +535,12 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
            }
     }
 
-    for(i=FRAG_ATTRIB_VAR0; i<FRAG_ATTRIB_MAX; i++)
+    for(i=VERT_RESULT_VAR0; i<VERT_RESULT_MAX; i++)
        {
-               unBit = 1 << i;
-               if(mesa_fp->Base.InputsRead & unBit)
+        unBit = 1 << i;
+        if(OutputsWritten & unBit)
                {
-            ui = pAsm->uiFP_AttributeMap[i];
+            ui = pAsm->uiFP_AttributeMap[i-VERT_RESULT_VAR0+FRAG_ATTRIB_VAR0];
             SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
             SETfield(r700->SPI_PS_INPUT_CNTL[ui].u32All, ui,
                             SEMANTIC_shift, SEMANTIC_mask);
@@ -538,8 +548,8 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
                        SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
             else
                        CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
-               }
-       }
+        }
+    }
 
     exportCount = (r700->ps.SQ_PGM_EXPORTS_PS.u32All & EXPORT_MODE_mask) / (1 << EXPORT_MODE_shift);
     if (r700->CB_SHADER_CONTROL.u32All != ((1 << exportCount) - 1))
@@ -551,7 +561,8 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
     /* sent out shader constants. */
     paramList = fp->mesa_program.Base.Parameters;
 
-    if(NULL != paramList) {
+    if(NULL != paramList) 
+    {
            _mesa_load_state_parameters(ctx, paramList);
 
            if (paramList->NumParameters > R700_MAX_DX9_CONSTS)
@@ -564,10 +575,10 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
            unNumParamData = paramList->NumParameters;
 
            for(ui=0; ui<unNumParamData; ui++) {
-                   r700->ps.consts[ui][0].f32All = paramList->ParameterValues[ui][0];
-                   r700->ps.consts[ui][1].f32All = paramList->ParameterValues[ui][1];
-                   r700->ps.consts[ui][2].f32All = paramList->ParameterValues[ui][2];
-                   r700->ps.consts[ui][3].f32All = paramList->ParameterValues[ui][3];
+                       r700->ps.consts[ui][0].f32All = paramList->ParameterValues[ui][0];
+                       r700->ps.consts[ui][1].f32All = paramList->ParameterValues[ui][1];
+                       r700->ps.consts[ui][2].f32All = paramList->ParameterValues[ui][2];
+                       r700->ps.consts[ui][3].f32All = paramList->ParameterValues[ui][3];
            }
     } else
            r700->ps.num_consts = 0;
index cbb108d21280556ac722e05ac54456e672bc05d8..843de2c0293c0ab7fca6586ba73adf32859ea37f 100644 (file)
@@ -49,12 +49,14 @@ struct r700_fragment_program
 
 /* Internal */
 void Map_Fragment_Program(r700_AssemblerBase         *pAsm,
-                         struct gl_fragment_program *mesa_fp);
+                         struct gl_fragment_program *mesa_fp,
+              GLcontext *ctx); //richard glsl nov.27
 GLboolean Find_Instruction_Dependencies_fp(struct r700_fragment_program *fp,
                                           struct gl_fragment_program   *mesa_fp);
 
 GLboolean r700TranslateFragmentShader(struct r700_fragment_program *fp,
-                                     struct gl_fragment_program   *mesa_vp);
+                                     struct gl_fragment_program   *mesa_vp,
+                      GLcontext *ctx); //richard glsl nov.27
 
 /* Interface */
 extern void r700SelectFragmentShader(GLcontext *ctx);
index c8f72d588b4a6e3ac943fadca7a9c8cd9cf68a5f..7715214da1a509e099da3a098cffb20cc2e0fb5d 100644 (file)
@@ -631,6 +631,14 @@ GLboolean r700SetupVertexProgram(GLcontext * ctx)
     paramList = vp->mesa_program->Base.Parameters;
 
     if(NULL != paramList) {
+        //vp->mesa_program was cloned, not updated by glsl shader api.
+        //_mesa_reference_program has already checked glsl shProg is ok and set ctx->VertexProgem._Current
+        // so, use ctx->VertexProgem._Current        
+        struct gl_program_parameter_list *paramListOrginal = 
+                         paramListOrginal = ctx->VertexProgram._Current->Base.Parameters;
+            
+        //---------------------------
+
            _mesa_load_state_parameters(ctx, paramList);
 
            if (paramList->NumParameters > R700_MAX_DX9_CONSTS)
@@ -643,10 +651,20 @@ GLboolean r700SetupVertexProgram(GLcontext * ctx)
            unNumParamData = paramList->NumParameters;
 
            for(ui=0; ui<unNumParamData; ui++) {
-                   r700->vs.consts[ui][0].f32All = paramList->ParameterValues[ui][0];
-                   r700->vs.consts[ui][1].f32All = paramList->ParameterValues[ui][1];
-                   r700->vs.consts[ui][2].f32All = paramList->ParameterValues[ui][2];
-                   r700->vs.consts[ui][3].f32All = paramList->ParameterValues[ui][3];
+            if(paramList->Parameters[ui].Type == PROGRAM_UNIFORM) 
+            {
+                r700->vs.consts[ui][0].f32All = paramListOrginal->ParameterValues[ui][0];
+                       r700->vs.consts[ui][1].f32All = paramListOrginal->ParameterValues[ui][1];
+                       r700->vs.consts[ui][2].f32All = paramListOrginal->ParameterValues[ui][2];
+                       r700->vs.consts[ui][3].f32All = paramListOrginal->ParameterValues[ui][3];
+            }
+            else
+            {
+                       r700->vs.consts[ui][0].f32All = paramList->ParameterValues[ui][0];
+                       r700->vs.consts[ui][1].f32All = paramList->ParameterValues[ui][1];
+                       r700->vs.consts[ui][2].f32All = paramList->ParameterValues[ui][2];
+                       r700->vs.consts[ui][3].f32All = paramList->ParameterValues[ui][3];
+            }
            }
     } else
            r700->vs.num_consts = 0;