From ca164bed8ef09e2274d2447f4c96b34020004290 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 19 Aug 2010 10:27:16 +1000 Subject: [PATCH] r600c: attempt to fix return in main --- src/mesa/drivers/dri/r600/r700_assembler.c | 22 ++++++++++++++-------- src/mesa/drivers/dri/r600/r700_assembler.h | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c index 2476174..bbe910f 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.c +++ b/src/mesa/drivers/dri/r600/r700_assembler.c @@ -5308,7 +5308,7 @@ GLboolean assemble_ENDLOOP(r700_AssemblerBase *pAsm) return GL_TRUE; } -void add_return_inst(r700_AssemblerBase *pAsm) +void add_return_inst(r700_AssemblerBase *pAsm, GLboolean in_main) { if(GL_FALSE == add_cf_instruction(pAsm) ) { @@ -5319,9 +5319,14 @@ void add_return_inst(r700_AssemblerBase *pAsm) pAsm->cf_current_cf_clause_ptr->m_Word1.f.cf_const = 0x0; pAsm->cf_current_cf_clause_ptr->m_Word1.f.cond = SQ_CF_COND_ACTIVE; - pAsm->cf_current_cf_clause_ptr->m_Word1.f.end_of_program = 0x0; pAsm->cf_current_cf_clause_ptr->m_Word1.f.valid_pixel_mode = 0x0; - pAsm->cf_current_cf_clause_ptr->m_Word1.f.cf_inst = SQ_CF_INST_RETURN; + if (in_main == GL_FALSE) { + pAsm->cf_current_cf_clause_ptr->m_Word1.f.end_of_program = 0x0; + pAsm->cf_current_cf_clause_ptr->m_Word1.f.cf_inst = SQ_CF_INST_RETURN; + } else { + pAsm->cf_current_cf_clause_ptr->m_Word1.f.end_of_program = 0x1; + pAsm->cf_current_cf_clause_ptr->m_Word1.f.cf_inst = SQ_CF_INST_NOP; + } pAsm->cf_current_cf_clause_ptr->m_Word1.f.whole_quad_mode = 0x0; pAsm->cf_current_cf_clause_ptr->m_Word1.f.barrier = 0x1; @@ -5398,6 +5403,7 @@ GLboolean assemble_ENDSUB(r700_AssemblerBase *pAsm) GLboolean assemble_RET(r700_AssemblerBase *pAsm) { GLuint unIF = 0; + GLboolean in_main = GL_FALSE; if(pAsm->CALLSP > 0) { /* in sub */ @@ -5417,16 +5423,16 @@ GLboolean assemble_RET(r700_AssemblerBase *pAsm) unIF++; } } - } + } else + in_main = GL_TRUE; #ifdef USE_CF_FOR_POP_AFTER - if(unIF > 0) - { + if (!in_main && unIF > 0) { pops(pAsm, unIF); } #endif /* USE_CF_FOR_POP_AFTER */ - add_return_inst(pAsm); + add_return_inst(pAsm, in_main); return GL_TRUE; } @@ -5643,7 +5649,7 @@ GLboolean returnOnFlag(r700_AssemblerBase *pAsm, GLuint unIF) jumpToOffest(pAsm, 1, 4); setRetInLoopFlag(pAsm, SQ_SEL_0); pops(pAsm, unIF + 1); - add_return_inst(pAsm); + add_return_inst(pAsm, GL_FALSE); return GL_TRUE; } diff --git a/src/mesa/drivers/dri/r600/r700_assembler.h b/src/mesa/drivers/dri/r600/r700_assembler.h index f00f4da..9031e72 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.h +++ b/src/mesa/drivers/dri/r600/r700_assembler.h @@ -560,7 +560,7 @@ GLboolean add_alu_instruction(r700_AssemblerBase* pAsm, GLuint contiguous_slots_needed); GLboolean add_cf_instruction(r700_AssemblerBase* pAsm); -void add_return_inst(r700_AssemblerBase *pAsm); +void add_return_inst(r700_AssemblerBase *pAsm, GLboolean in_main); void get_src_properties(R700ALUInstruction* alu_instruction_ptr, int source_index, -- 1.7.1