inline void NineVolume9_AddDirtyRegion( struct NineVolume9 *This, const struct pipe_box *box ) { struct pipe_box cover_a, cover_b; float vol[2]; if (!box) { u_box_3d(0, 0, 0, This->desc.Width, This->desc.Height, This->desc.Depth, &This->dirty_box[0]); memset(&This->dirty_box[1], 0, sizeof(This->dirty_box[1])); return; } if (!This->dirty_box[0].width) { This->dirty_box[0] = *box; return; } u_box_union_3d(&cover_a, &This->dirty_box[0], box); vol[0] = u_box_volume_3d(&cover_a); if (This->dirty_box[1].width == 0) { vol[1] = u_box_volume_3d(&This->dirty_box[0]); if (vol[0] > (vol[1] * 1.5f)) This->dirty_box[1] = *box; else This->dirty_box[0] = cover_a; } else { u_box_union_3d(&cover_b, &This->dirty_box[1], box); vol[1] = u_box_volume_3d(&cover_b); if (vol[0] > vol[1]) This->dirty_box[1] = cover_b; else This->dirty_box[0] = cover_a; } }
HRESULT NINE_WINAPI NineVolumeTexture9_AddDirtyBox( struct NineVolumeTexture9 *This, const D3DBOX *pDirtyBox ) { DBG("This=%p pDirtybox=%p\n", This, pDirtyBox); if (This->base.base.pool == D3DPOOL_DEFAULT) { return D3D_OK; } if (This->base.base.pool == D3DPOOL_MANAGED) { This->base.managed.dirty = TRUE; BASETEX_REGISTER_UPDATE(&This->base); } if (!pDirtyBox) { This->dirty_box.x = 0; This->dirty_box.y = 0; This->dirty_box.z = 0; This->dirty_box.width = This->base.base.info.width0; This->dirty_box.height = This->base.base.info.height0; This->dirty_box.depth = This->base.base.info.depth0; } else { if (This->dirty_box.width == 0) { d3dbox_to_pipe_box(&This->dirty_box, pDirtyBox); } else { struct pipe_box box; d3dbox_to_pipe_box(&box, pDirtyBox); u_box_union_3d(&This->dirty_box, &This->dirty_box, &box); } This->dirty_box.x = MAX2(This->dirty_box.x, 0); This->dirty_box.y = MAX2(This->dirty_box.y, 0); This->dirty_box.z = MAX2(This->dirty_box.z, 0); This->dirty_box.width = MIN2(This->dirty_box.width, This->base.base.info.width0 - This->dirty_box.x); This->dirty_box.height = MIN2(This->dirty_box.height, This->base.base.info.height0 - This->dirty_box.y); This->dirty_box.depth = MIN2(This->dirty_box.depth, This->base.base.info.depth0 - This->dirty_box.z); } return D3D_OK; }