diff --git a/hw/nv2a.c b/hw/nv2a.c index e9dae8b45b..0845180ef2 100644 --- a/hw/nv2a.c +++ b/hw/nv2a.c @@ -1126,8 +1126,7 @@ static void kelvin_bind_converted_vertex_attributes(NV2AState *d, for (j=attribute->converted_elements; j<num_elements; j++) { uint8_t *in = data + j * attribute->stride; - uint8_t *out = attribute->converted_buffer - + j * stride; + uint8_t *out = attribute->converted_buffer + j * stride; switch (attribute->format) { case NV097_SET_VERTEX_DATA_ARRAY_FORMAT_TYPE_CMP: @@ -1268,6 +1267,8 @@ static void kelvin_bind_vertexshader(KelvinState *kelvin) &native); assert(native); + assert(glGetError() == GL_NO_ERROR); + QDECREF(shader_code); shader->dirty = false; } @@ -1355,7 +1356,7 @@ static void kelvin_bind_textures(NV2AState *d, KelvinState *kelvin) assert(dma.start + texture->offset < memory_region_size(d->vram)); - NV2A_DPRINTF(" texture %d is format %d, (%d, %d; %d)\n", + NV2A_DPRINTF(" texture %d is format 0x%x, (%d, %d; %d)\n", i, texture->color_format, width, height, texture->pitch); @@ -1471,6 +1472,12 @@ static void kelvin_read_surface(NV2AState *d, KelvinState *kelvin) kelvin->surface_color.width, kelvin->surface_color.height, d->vram_ptr + color_dma.start + kelvin->surface_color.offset); + assert(glGetError() == GL_NO_ERROR); + + memory_region_set_dirty(d->vram, + color_dma.start + kelvin->surface_color.offset, + kelvin->surface_color.pitch + * kelvin->surface_color.height); } } @@ -1680,13 +1687,11 @@ static void pgraph_method(NV2AState *d, for (y=0; y<image_blit->height; y++) { uint8_t *source_row = source + (image_blit->in_y + y) * context_surfaces->source_pitch - + image_blit->in_x - * bytes_per_pixel; + + image_blit->in_x * bytes_per_pixel; uint8_t *dest_row = dest + (image_blit->out_y + y) * context_surfaces->dest_pitch - + image_blit->out_x - * bytes_per_pixel; + + image_blit->out_x * bytes_per_pixel; memmove(dest_row, source_row, image_blit->width * bytes_per_pixel); @@ -1930,8 +1935,17 @@ static void pgraph_method(NV2AState *d, glDrawArrays(kelvin->gl_primitive_mode, 0, index_count); } else if (kelvin->array_batch_length) { + + + uint32_t max_element = 0; + uint32_t min_elemenet = (uint32_t)-1; + for (i=0; i<kelvin->array_batch_length; i++) { + max_element = MAX(kelvin->array_batch[i], max_element); + min_elemenet = MIN(kelvin->array_batch[i], min_elemenet); + } + kelvin_bind_converted_vertex_attributes(d, kelvin, - false, kelvin->array_batch_length); + false, max_element+1); glDrawElements(kelvin->gl_primitive_mode, kelvin->array_batch_length, GL_UNSIGNED_INT,