don't reparse poly parameters between tri strips reusing the same global parameters

This commit is contained in:
Anthony Pesch 2015-09-24 16:41:21 -07:00
parent e8fd5c7367
commit 88b680f28a
3 changed files with 75 additions and 66 deletions

View File

@ -30,7 +30,8 @@ static float HueToRGB(float p, float q, float t) {
return p;
}
static void HSLToRGB(float h, float s, float l, uint8_t *r, uint8_t *g, uint8_t *b) {
static void HSLToRGB(float h, float s, float l, uint8_t *r, uint8_t *g,
uint8_t *b) {
float fr, fg, fb;
if (s == 0.0f) {

View File

@ -107,63 +107,7 @@ TileRenderer::TileRenderer(TextureProvider &texture_provider)
: texture_provider_(texture_provider) {}
void TileRenderer::RenderContext(const TileContext *tactx, Backend *rb) {
PROFILER_GPU("TileRenderer::RenderContext");
const uint8_t *data = tactx->data;
const uint8_t *end = tactx->data + tactx->size;
Reset();
ParseBackground(tactx);
while (data < end) {
PCW pcw = *(PCW *)data;
// FIXME
// If Vertex Parameters with the "End of Strip" specification were not
// input, but parameters other than the Vertex Parameters were input, the
// polygon data in question is ignored and an interrupt signal is output.
switch (pcw.para_type) {
// control params
case TA_PARAM_END_OF_LIST:
ParseEndOfList(tactx);
break;
case TA_PARAM_USER_TILE_CLIP:
last_poly_ = nullptr;
last_vertex_ = nullptr;
break;
case TA_PARAM_OBJ_LIST_SET:
LOG_FATAL("TA_PARAM_OBJ_LIST_SET unsupported");
break;
// global params
case TA_PARAM_POLY_OR_VOL:
ParsePolyParam(tactx, rb, reinterpret_cast<const PolyParam *>(data));
break;
case TA_PARAM_SPRITE:
ParsePolyParam(tactx, rb, reinterpret_cast<const PolyParam *>(data));
break;
// vertex params
case TA_PARAM_VERTEX:
ParseVertexParam(tactx, rb,
reinterpret_cast<const VertexParam *>(data));
break;
default:
LOG_FATAL("Unhandled");
break;
}
data += TileAccelerator::GetParamSize(pcw, vertex_type_);
}
// LOG_INFO("StartRender %d surfs, %d verts, %d bytes", num_surfs_,
// num_verts_, tactx->size);
ParseContext(tactx, rb);
const Eigen::Matrix4f &projection = GetProjectionMatrix(tactx);
rb->RenderSurfaces(projection, surfs_, num_surfs_, verts_, num_verts_,
@ -183,21 +127,28 @@ void TileRenderer::Reset() {
last_sorted_surf_ = 0;
}
Surface *TileRenderer::AllocSurf() {
Surface *TileRenderer::AllocSurf(bool copy_from_prev) {
CHECK_LT(num_surfs_, MAX_SURFACES);
// reuse previous surface if it wasn't completed, else, allocate a new one
int id;
if (last_vertex_ && !last_vertex_->type0.pcw.end_of_strip) {
CHECK(!copy_from_prev);
id = num_surfs_ - 1;
} else {
id = num_surfs_++;
}
// reset the surface
// either reset the surface state, or copy the state from the previous surface
Surface *surf = &surfs_[id];
new (surf) Surface();
if (copy_from_prev) {
CHECK_GT(id, 0);
*surf = surfs_[id - 1];
} else {
new (surf) Surface();
}
surf->first_vert = num_verts_;
surf->num_verts = 0;
// default sort the surface
sorted_surfs_[id] = id;
@ -274,7 +225,7 @@ void TileRenderer::ParseOffsetColor(float intensity, uint32_t *color) {
void TileRenderer::ParseBackground(const TileContext *tactx) {
// translate the surface
Surface *surf = AllocSurf();
Surface *surf = AllocSurf(false);
surf->texture = 0;
surf->depth_write = !tactx->bg_isp.z_write_disable;
@ -355,7 +306,7 @@ void TileRenderer::ParsePolyParam(const TileContext *tactx, Backend *rb,
vertex_type_ = TileAccelerator::GetVertexType(param->type0.pcw);
// setup the new surface
Surface *surf = AllocSurf();
Surface *surf = AllocSurf(false);
surf->depth_write = !param->type0.isp_tsp.z_write_disable;
surf->depth_func =
TranslateDepthFunc(param->type0.isp_tsp.depth_compare_mode);
@ -439,8 +390,7 @@ void TileRenderer::ParseVertexParam(const TileContext *tactx, Backend *rb,
// the next polygon may be input immediately after inputting a Vertex
// Parameter for which "End of Strip" was specified.
if (last_vertex_ && last_vertex_->type0.pcw.end_of_strip) {
// start a new surface
ParsePolyParam(tactx, rb, last_poly_);
AllocSurf(true);
}
last_vertex_ = param;
@ -651,6 +601,63 @@ void TileRenderer::ParseEndOfList(const TileContext *tactx) {
last_sorted_surf_ = num_surfs_;
}
void TileRenderer::ParseContext(const TileContext *tactx, Backend *rb) {
PROFILER_GPU("TileRenderer::ParseContext");
const uint8_t *data = tactx->data;
const uint8_t *end = tactx->data + tactx->size;
Reset();
ParseBackground(tactx);
while (data < end) {
PCW pcw = *(PCW *)data;
// FIXME
// If Vertex Parameters with the "End of Strip" specification were not
// input, but parameters other than the Vertex Parameters were input, the
// polygon data in question is ignored and an interrupt signal is output.
switch (pcw.para_type) {
// control params
case TA_PARAM_END_OF_LIST:
ParseEndOfList(tactx);
break;
case TA_PARAM_USER_TILE_CLIP:
last_poly_ = nullptr;
last_vertex_ = nullptr;
break;
case TA_PARAM_OBJ_LIST_SET:
LOG_FATAL("TA_PARAM_OBJ_LIST_SET unsupported");
break;
// global params
case TA_PARAM_POLY_OR_VOL:
ParsePolyParam(tactx, rb, reinterpret_cast<const PolyParam *>(data));
break;
case TA_PARAM_SPRITE:
ParsePolyParam(tactx, rb, reinterpret_cast<const PolyParam *>(data));
break;
// vertex params
case TA_PARAM_VERTEX:
ParseVertexParam(tactx, rb,
reinterpret_cast<const VertexParam *>(data));
break;
default:
LOG_FATAL("Unhandled");
break;
}
data += TileAccelerator::GetParamSize(pcw, vertex_type_);
}
}
// Vertices coming into the TA are in window space, with the Z component being
// 1/W. These coordinates need to be converted back to clip space in order to
// be rendered with OpenGL, etc. While we want to perform an orthographic

View File

@ -49,7 +49,7 @@ class TileRenderer {
private:
void Reset();
renderer::Surface *AllocSurf();
renderer::Surface *AllocSurf(bool copy_from_prev);
renderer::Vertex *AllocVert();
void ParseColor(uint32_t base_color, uint32_t *color);
void ParseColor(float r, float g, float b, float a, uint32_t *color);
@ -63,6 +63,7 @@ class TileRenderer {
void ParseVertexParam(const TileContext *tactx, renderer::Backend *rb,
const VertexParam *param);
void ParseEndOfList(const TileContext *tactx);
void ParseContext(const TileContext *tactx, renderer::Backend *rb);
Eigen::Matrix4f GetProjectionMatrix(const TileContext *tactx);
renderer::TextureHandle RegisterTexture(const TileContext *tactx,