static void render_begin( struct draw_stage *stage ) { #if 0 struct render_stage *render = render_stage(stage); struct cell_context *sp = render->cell; const struct pipe_shader_state *fs = &render->cell->fs->shader; render->quad.nr_attrs = render->cell->nr_frag_attrs; render->firstFpInput = fs->input_semantic_name[0]; sp->quad.first->begin(sp->quad.first); #endif }
static void render_tri(struct draw_stage *stage, struct prim_header *prim) { struct render_stage *rs = render_stage(stage); struct cell_context *cell = rs->cell; struct cell_prim_buffer *buf = &cell->prim_buffer; uint i; if (buf->num_verts + 3 > CELL_MAX_VERTS) { cell_flush_prim_buffer(cell); } i = buf->num_verts; assert(i+2 <= CELL_MAX_VERTS); save_vertex(buf, i+0, prim->v[0]); save_vertex(buf, i+1, prim->v[1]); save_vertex(buf, i+2, prim->v[2]); buf->num_verts += 3; }
int renderman_rendertask_repeat(RepeatInfo* info, RenderContext* ctx) { SceneData* sceneData = find_scene_data (ctx->scene); if ( !sceneData ) { log_message("error: scene data is missing"); return -1; } SceneObject* so; SoData* soData; char progKey[KEYSIZE]; Attribute* attribute; size_t numAttributes; GLuint program; char bufferKey[KEYSIZE]; GLuint bufferHandle; char iboKey[KEYSIZE]; GLuint iboHandle; Draw* method; int i; int k; ////////////////////////////////////////////////// //////////////////////// STAGE Gbuffer ////////////////////////////////////////////////// glBindFramebuffer(GL_FRAMEBUFFER, sceneData->fbos[0]); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glDisable(GL_BLEND); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for (i = list_size(sceneData->stageGbuffer) - 1; i >= 0; i--) { so = list_get(i, sceneData->stageGbuffer); soData = find_so_data ( sceneData, so ); if ( !soData ) { log_message ( "error: scene object has not been setup correctly - removing." ); tear_down_so ( sceneData, so ); list_remove_elem( so, sceneData->stageGbuffer ); continue; } program = (GLuint)hashmap_find( "gbuffer", staticPrograms ); glUseProgram ( program ); if ( -1 == find_and_pass_uniforms (sceneData, so, (GLuint)program)) { tear_down_so ( sceneData, so ); list_remove_elem( so, sceneData->stageGbuffer ); continue; } for (k = 0; k < 2; k++) { // position and normal must be first 2 shader attributes attribute = list_get ( k, soData->attributes ); if ( 1 == attribute->useBuffer ) { snprintf ( bufferKey, KEYSIZE, "%p", attribute ); bufferHandle = (GLuint)hashmap_find ( bufferKey, sceneData->mapBuffer2Handle ); glBindBuffer (GL_ARRAY_BUFFER, bufferHandle); glVertexAttribPointer (k, attribute->numComponents, attribute->dataType, GL_FALSE, 0, 0); glEnableVertexAttribArray(k); } else { glVertexAttribPointer (k, attribute->numComponents, attribute->dataType, GL_FALSE, 0, attribute->data); glEnableVertexAttribArray(k); } } method = so->draw; if ( NULL == method->indices ) { glDrawArrays ( method->type, method->start, method->count ); } else { snprintf( iboKey, KEYSIZE, "%p", method->indices ); iboHandle = (GLuint)hashmap_find ( iboKey, sceneData->mapBuffer2Handle ); if ( 1 == method->indices->useBuffer ) { glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, iboHandle ); } glDrawElements ( method->type, method->count, method->indices->dataType, 1 == method->indices->useBuffer ? 0 : method->indices->data ); } for (k = 0; k < 2; k++) { glDisableVertexAttribArray(k); } glBindBuffer (GL_ARRAY_BUFFER, 0); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); glBindTexture (GL_TEXTURE_2D, 0); } ////////////////////////////////////////////////// //////////////////////// STAGE Light ////////////////////////////////////////////////// glBindFramebuffer(GL_FRAMEBUFFER, sceneData->fbos[1]); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glClear(GL_COLOR_BUFFER_BIT); render_stage(sceneData->stageLight, sceneData, so, soData, progKey, attribute, numAttributes, program, bufferKey, bufferHandle, iboKey, iboHandle, method, i, k); ////////////////////////////////////////////////// //////////////////////// STAGE Geometry ////////////////////////////////////////////////// glBindFramebuffer(GL_FRAMEBUFFER, 0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glDisable(GL_BLEND); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); render_stage(sceneData->stageGeometry, sceneData, so, soData, progKey, attribute, numAttributes, program, bufferKey, bufferHandle, iboKey, iboHandle, method, i, k); ////////////////////////////////////////////////// //////////////////////// STAGE Particle ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////////// STAGE Overlay ////////////////////////////////////////////////// glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); render_stage(sceneData->stageOverlay, sceneData, so, soData, progKey, attribute, numAttributes, program, bufferKey, bufferHandle, iboKey, iboHandle, method, i, k); ////////////////////////////////////////////////// //////////////////////// STAGE Postprocessing ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////////// STAGE Update ////////////////////////////////////////////////// eglSwapBuffers(ctx->esContext->display, ctx->esContext->surface); if ( ctx->updateFunc ) { ctx->updateFunc(ctx->userData, info->overruns); } return 0; }
static void reset_stipple_counter( struct draw_stage *stage ) { struct render_stage *render = render_stage(stage); /*render->cell->line_stipple_counter = 0;*/ }