Пример #1
0
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
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
static void reset_stipple_counter( struct draw_stage *stage )
{
   struct render_stage *render = render_stage(stage);
   /*render->cell->line_stipple_counter = 0;*/
}