summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuentin Ladevie <qladevie@virtuos.com.cn>2024-01-04 08:50:34 +0100
committerQuentin Ladevie <qladevie@virtuos.com.cn>2024-01-04 08:50:34 +0100
commit4c6df70c60e25e9b65494bbf001d1365c27122f4 (patch)
treeb833d12123d9d51800e30a3b0a07edee93a90f95
parent792533ab9b6de49ba864b60a6d79e3e58a9608e2 (diff)
Fix barycentric and change avg cycles computationsHEADmaster
-rw-r--r--main.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/main.c b/main.c
index 681f4c6..10aaebe 100644
--- a/main.c
+++ b/main.c
@@ -310,7 +310,7 @@ void RenderTriangleSIMDSimplified(void) {
__m128i m_one = _mm_set1_epi32(-1);
__m128i two = _mm_set1_epi32(2);
- __m128i mask = _mm_set_epi32(0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff);
+ __m128i mask = _mm_set1_epi32(0x000000ff);
__m128i vx = _mm_set_epi32(min_x + 1, min_x, min_x + 1, min_x);
__m128i vy = _mm_set_epi32(min_y + 1, min_y + 1, min_y, min_y);
@@ -340,7 +340,7 @@ void RenderTriangleSIMDSimplified(void) {
__m128i diffy3 = _mm_mullo_epi32(v2v0x, two);
UINT32 area = (t.y[0] - t.y[1]) * t.x[2] + (t.x[1] - t.x[0]) * t.y[2] + (t.x[0] * t.y[1] - t.y[0] * t.x[1]);
- __m128i v_area = _mm_set1_epi32(0x0fffffff / area);
+ __m128i v_area = _mm_set1_epi32((0xff << 16) / area);
for (UINT32 y = min_y; y < max_y + 1; y += 2) {
UINT32 row_1 = y * g_width;
@@ -354,9 +354,9 @@ void RenderTriangleSIMDSimplified(void) {
__m128i or = _mm_or_si128(dt1_or_dt2, dt3);
__m128i gtz = _mm_cmpgt_epi32(or, m_one);
- __m128i b1 = _mm_srli_epi32(_mm_mullo_epi32(dt1, v_area), 20);
- __m128i b2 = _mm_srli_epi32(_mm_mullo_epi32(dt2, v_area), 20);
- __m128i b3 = _mm_srli_epi32(_mm_mullo_epi32(dt3, v_area), 20);
+ __m128i b1 = _mm_srli_epi32(_mm_mullo_epi32(dt1, v_area), 16);
+ __m128i b2 = _mm_srli_epi32(_mm_mullo_epi32(dt2, v_area), 16);
+ __m128i b3 = _mm_srli_epi32(_mm_mullo_epi32(dt3, v_area), 16);
__m128i masked_b1 = _mm_and_si128(b1, mask);
__m128i masked_b2 = _mm_slli_epi32(_mm_and_si128(b2, mask), 8);
@@ -379,8 +379,8 @@ void RenderTriangleSIMDSimplified(void) {
DWORD64 end = __rdtsc();
DWORD64 diff = end - start;
- // avg_simd_simpl = ((avg_simd_simpl * frame_count) + diff) / (frame_count + 1);
avg_simd_simpl = (avg_simd_simpl + diff) / 2;
+ // avg_simd_simpl = ((avg_simd_simpl * frame_count) + diff) / (frame_count + 1);
char buffer[1024];
wsprintfA(buffer, "SIMD simplified %u cycles per triangle\n", diff);
@@ -435,9 +435,9 @@ LRESULT CALLBACK WndProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) {
break;
}
case WM_PAINT: {
- RenderFullscren();
- RenderTriangle();
- RenderTriangleSIMD();
+ // RenderFullscren();
+ // RenderTriangle();
+ // RenderTriangleSIMD();
RenderTriangleSIMDSimplified();
frame_count++;
@@ -485,9 +485,9 @@ int mainCRTStartup(void) {
DispatchMessage(&msg);
}
- RenderFullscren();
- RenderTriangle();
- RenderTriangleSIMD();
+ // RenderFullscren();
+ // RenderTriangle();
+ // RenderTriangleSIMD();
RenderTriangleSIMDSimplified();
frame_count++;
}