summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2018-11-15 23:12:37 +0100
committerNiels Martin Hansen <nielsm@indvikleren.dk>2018-11-18 17:30:28 +0100
commit1a1204472e4d047de824686e9f606d7c832ec698 (patch)
treebc96001568b0d3380eb54b296345e42a0f22b78d
parent68e6b5531a85788edef87140db33fee821df02a6 (diff)
downloadopenttd-1a1204472e4d047de824686e9f606d7c832ec698.tar.xz
Revert: Sprite sorting optimisation sorted incorrectly.
This reverts commit 25ab9c1997f770f4a8a66bb3ad4b82ba87e3a977.
-rw-r--r--src/viewport.cpp20
-rw-r--r--src/viewport_sprite_sorter_sse4.cpp25
2 files changed, 6 insertions, 39 deletions
diff --git a/src/viewport.cpp b/src/viewport.cpp
index 13f87de1d..350bb9238 100644
--- a/src/viewport.cpp
+++ b/src/viewport.cpp
@@ -88,7 +88,6 @@
#include "command_func.h"
#include "network/network_func.h"
#include "framerate_type.h"
-#include "core/sort_func.hpp"
#include <map>
@@ -1380,22 +1379,11 @@ static bool ViewportSortParentSpritesChecker()
return true;
}
-static int CDECL CompareParentSprites(ParentSpriteToDraw * const *psd, ParentSpriteToDraw * const *psd2)
-{
- const ParentSpriteToDraw *ps = *psd;
- const ParentSpriteToDraw *ps2 = *psd2;
- return ps->xmin - ps2->xmin;
-}
-
/** Sort parent sprites pointer array */
static void ViewportSortParentSprites(ParentSpriteToSortVector *psdv)
{
ParentSpriteToDraw **psdvend = psdv->End();
ParentSpriteToDraw **psd = psdv->Begin();
-
- /* pre-sort by xmin in ascending order */
- QSortT(psd, psdvend - psd, CompareParentSprites);
-
while (psd != psdvend) {
ParentSpriteToDraw *ps = *psd;
@@ -1432,11 +1420,9 @@ static void ViewportSortParentSprites(ParentSpriteToSortVector *psdv)
* I.e. every single order of X, Y, Z says ps2 is behind ps or they overlap.
* That is: If one partial order says ps behind ps2, do not change the order.
*/
- if (ps->xmax < ps2->xmin) {
- /* all following sprites have xmin >= ps2->xmin */
- break;
- }
- if (ps->ymax < ps2->ymin || ps->zmax < ps2->zmin) {
+ if (ps->xmax < ps2->xmin ||
+ ps->ymax < ps2->ymin ||
+ ps->zmax < ps2->zmin) {
continue;
}
}
diff --git a/src/viewport_sprite_sorter_sse4.cpp b/src/viewport_sprite_sorter_sse4.cpp
index cd898f00e..fb78c51c8 100644
--- a/src/viewport_sprite_sorter_sse4.cpp
+++ b/src/viewport_sprite_sorter_sse4.cpp
@@ -15,7 +15,6 @@
#include "cpu.h"
#include "smmintrin.h"
#include "viewport_sprite_sorter.h"
-#include "core/sort_func.hpp"
#include "safeguards.h"
@@ -26,24 +25,12 @@
#define LOAD_128 _mm_loadu_si128
#endif
-static int CDECL CompareParentSprites(ParentSpriteToDraw * const *psd, ParentSpriteToDraw * const *psd2)
-{
- const ParentSpriteToDraw *ps = *psd;
- const ParentSpriteToDraw *ps2 = *psd2;
- return ps->xmin - ps2->xmin;
-}
-
/** Sort parent sprites pointer array using SSE4.1 optimizations. */
void ViewportSortParentSpritesSSE41(ParentSpriteToSortVector *psdv)
{
- const __m128i mask_ptest = _mm_setr_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0);
- const __m128i mask_ptest2 = _mm_setr_epi8(-1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ const __m128i mask_ptest = _mm_setr_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0);
ParentSpriteToDraw ** const psdvend = psdv->End();
ParentSpriteToDraw **psd = psdv->Begin();
-
- /* pre-sort by xmin in ascending order */
- QSortT(psd, psdvend - psd, CompareParentSprites);
-
while (psd != psdvend) {
ParentSpriteToDraw * const ps = *psd;
@@ -77,14 +64,8 @@ void ViewportSortParentSpritesSSE41(ParentSpriteToSortVector *psdv)
__m128i ps1_max = LOAD_128((__m128i*) &ps->xmax);
__m128i ps2_min = LOAD_128((__m128i*) &ps2->xmin);
__m128i rslt1 = _mm_cmplt_epi32(ps1_max, ps2_min);
- if (!_mm_testz_si128(mask_ptest, rslt1)) {
- if (!_mm_testz_si128(mask_ptest2, rslt1) /* ps->xmax < ps2->xmin */) {
- /* all following sprites have xmin >= ps2->xmin */
- break;
- } else {
- continue;
- }
- }
+ if (!_mm_testz_si128(mask_ptest, rslt1))
+ continue;
__m128i ps1_min = LOAD_128((__m128i*) &ps->xmin);
__m128i ps2_max = LOAD_128((__m128i*) &ps2->xmax);