Text archives Help
- From: no_author@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [MANTA] r1124 - in trunk: Engine/Display Image Interface scenes
- Date: Tue, 20 Jun 2006 16:05:03 -0600 (MDT)
Author: None
Date: Tue Jun 20 16:05:02 2006
New Revision: 1124
Modified:
trunk/Engine/Display/PureOpenGLDisplay.cc
trunk/Image/SimpleImage.h
trunk/Image/SimpleImage_special.cc
trunk/Interface/RayPacket.h
trunk/scenes/objviewer.cc
Log:
Engine/Display/PureOpenGLDisplay.cc
Added options to print out which function actually drew the picture
when doing verbose mode.
Removed an unneeded gl_print_error in the middle of the
drawImage_pbo function.
Added support for floating point textures.
Image/SimpleImage.h
Image/SimpleImage_special.cc
Added specialization for SimpleImage<RGBAfloatPixel>::set using SSE.
Interface/RayPacket.h
Fixed computation of inverseDirection using SSE. The previous code
didn't take into consideration when ray packet sizes were not a
multiple of 4 or aligned on 16 byte boundaries.
scenes/objviewer.cc
Added LinearGroup_Build which puts the triangles in a Group without
an acceleration structure.
Modified: trunk/Engine/Display/PureOpenGLDisplay.cc
==============================================================================
--- trunk/Engine/Display/PureOpenGLDisplay.cc (original)
+++ trunk/Engine/Display/PureOpenGLDisplay.cc Tue Jun 20 16:05:02 2006
@@ -323,10 +323,13 @@
if(mode == "pbo" && drawImage_pbo(image)){
// Drawn by texture...
+ if (verbose) cerr << "pbo mode drew it\n";
} else if (mode == "texture" && drawImage_texture(image)) {
// Drawn by pbo...
+ if (verbose) cerr << "texture mode drew it\n";
} else if(drawImage_pixels(image)){
// Drawn by pixels...
+ if (verbose) cerr << "image mode drew it\n";
} else {
throw InternalError("Unknown image type in OpenGLDisplay",
__FILE__, __LINE__);
@@ -502,8 +505,6 @@
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_RECTANGLE_EXT);
- gl_print_error(__FILE__,__LINE__);
-
GLenum format;
GLenum type;
bool have_alpha;
@@ -691,6 +692,12 @@
} else if(typeid(*image) == typeid(SimpleImage<BGRA8Pixel>)){
format = GL_BGRA;
type = big_endian? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_INT_8_8_8_8_REV;
+ } else if(typeid(*image) == typeid(SimpleImage<RGBAfloatPixel>)){
+ format = GL_RGBA;
+ type = GL_FLOAT;
+ } else if(typeid(*image) == typeid(SimpleImage<RGBfloatPixel>)){
+ format = GL_RGB;
+ type = GL_FLOAT;
} else {
return false;
}
Modified: trunk/Image/SimpleImage.h
==============================================================================
--- trunk/Image/SimpleImage.h (original)
+++ trunk/Image/SimpleImage.h Tue Jun 20 16:05:02 2006
@@ -132,6 +132,9 @@
template<>
void SimpleImage<RGBA8Pixel>::set(const Fragment& fragment);
+ template<>
+ void SimpleImage<RGBAfloatPixel>::set(const Fragment& fragment);
+
template<class Pixel>
void SimpleImage<Pixel>::get(Fragment& fragment) const
{
Modified: trunk/Image/SimpleImage_special.cc
==============================================================================
--- trunk/Image/SimpleImage_special.cc (original)
+++ trunk/Image/SimpleImage_special.cc Tue Jun 20 16:05:02 2006
@@ -142,31 +142,92 @@
__m128i g32 = _mm_cvttps_epi32(g); // 32 bits: g0g1g2g3
__m128i b32 = _mm_cvttps_epi32(b); // 32 bits: b0b1b2b3
- // 16 bits: b0b1b2b3r0r1r2r3
+ // 16 bits: r0r1r2r3b0b1b2b3
__m128i rb16 = _mm_packs_epi32(r32, b32);
// 16 bits: g0g1g2g3a0a1a2a3
__m128i ga16 = _mm_packs_epi32(g32, alpha);
- // 16 bits: b0g0b1g1b2g2b3g3
+ // 16 bits: r0g0r1g1r2g2r3g3
__m128i rg16 = _mm_unpacklo_epi16(rb16, ga16);
- // 16 bits: r0a0r1a1r2a2r3a3
+ // 16 bits: b0a0b1a1b2a2b3a3
__m128i ba16 = _mm_unpackhi_epi16(rb16, ga16);
- // 16 bits: b0g0r0a0b1g1r1a1
+ // 16 bits: r0g0b0a0r1g1b1a1
__m128i rgba16a = _mm_unpacklo_epi32(rg16, ba16);
- // 16 bits: b2g2r2a2b3g3r3a3
+ // 16 bits: r2g2b2a2r3g3b3a3
__m128i rgba16b = _mm_unpackhi_epi32(rg16, ba16);
- // 32 bits: b0g0r0a0 ... b3g3r3a3
+ // 32 bits: r0g0b0a0 ... r3g3b3a3
__m128i result = _mm_packus_epi16(rgba16a, rgba16b);
// Copy data over
_mm_stream_si128((__m128i*)pix, result);
pix += 4;
+ }
+ } else
+#endif /* MANTA_SSE */
+ {
+ for(int i=fragment.begin(); i< fragment.end();i++)
+ convertToPixel(*pix++, fragment.getColor(i).convertRGB());
+ }
+ } else {
+ for(int i=fragment.begin();i<fragment.end();i++){
+
convertToPixel(eyeStart[fragment.getWhichEye(i)][fragment.getY(i)][fragment.getX(i)],
fragment.getColor(i).convertRGB());
+ }
+ }
+}
+
+// vec_a = a[0], a[1], a[2], a[3]
+// vec_b = b[0], b[1], b[2], b[3]
+// Result = a[f0],a[f1],b[f2],b[f3]
+#define swizzle4(vec_a, vec_b, f0, f1, f2, f3) \
+ _mm_shuffle_ps( (vec_a), (vec_b), _MM_SHUFFLE(f3, f2, f1, f0) )
+
+template<>
+void SimpleImage<RGBAfloatPixel>::set(const Fragment& fragment)
+{
+ if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
+ Fragment::ConsecutiveX|Fragment::ConstantEye){
+ int b = fragment.begin();
+ RGBAfloatPixel* pix =
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
+#if MANTA_SSE
+ float* fpix = reinterpret_cast<float*>(pix);
+ // If the fragment and the pixel are on an aligned boundary, use SSE
+ if(((fragment.pixelBegin | fragment.pixelEnd) & 0x3) == 0){
+ // Aligned for SSE
+ int f = fragment.end()-3;
+ for(int i=fragment.begin(); i< f;i+=4){
+ __m128 r = _mm_load_ps(&fragment.color[0][i]);
+ __m128 g = _mm_load_ps(&fragment.color[1][i]);
+ __m128 b = _mm_load_ps(&fragment.color[2][i]);
+ __m128 a = _mm_set_ps1(1.0f); // alpha a0a1a2a3
+
+ // r0r1g0g1
+ __m128 rg01 = swizzle4(r, g, 0, 1, 0, 1);
+ // r2r3g2g3
+ __m128 rg23 = swizzle4(r, g, 2, 3, 2, 3);
+ // b0b1a0a1
+ __m128 ba01 = swizzle4(b, a, 0, 1, 0, 1);
+ // b2b3a2a3
+ __m128 ba23 = swizzle4(b, a, 2, 3, 2, 3);
+
+ // r0g0b0g0...
+ __m128 p0 = swizzle4(rg01, ba01, 0, 2, 0, 2);
+ __m128 p1 = swizzle4(rg01, ba01, 1, 3, 1, 3);
+ __m128 p2 = swizzle4(rg23, ba23, 0, 2, 0, 2);
+ __m128 p3 = swizzle4(rg23, ba23, 1, 3, 1, 3);
+
+ // Copy data over
+ _mm_stream_ps(fpix, p0);
+ _mm_stream_ps(fpix+4, p1);
+ _mm_stream_ps(fpix+8, p2);
+ _mm_stream_ps(fpix+12, p3);
+
+ fpix += 16;
}
} else
#endif /* MANTA_SSE */
Modified: trunk/Interface/RayPacket.h
==============================================================================
--- trunk/Interface/RayPacket.h (original)
+++ trunk/Interface/RayPacket.h Tue Jun 20 16:05:02 2006
@@ -19,7 +19,7 @@
#endif
// #include <sgi_stl_warnings_off.h>
-// #include <algorithm>
+// #include <iostream>
// #include <sgi_stl_warnings_on.h>
namespace Manta {
@@ -293,18 +293,31 @@
#if MANTA_SSE
int b = (rayBegin + 3) & (~3);
int e = rayEnd & (~3);
-#pragma unroll(3)
- for(int j=0; j<3; j++)
- {
- sse_t* dirs = (sse_t*)data->direction[j];
- sse_t* inv_dirs = (sse_t*)data->inverseDirection[j];
- for(int smd=b; smd<e; smd++)
- inv_dirs[smd] = oneOver(dirs[smd]);
+ if (b == e) {
+ for(int i=rayBegin;i<rayEnd;i++)
+ for(int j=0;j<3;j++)
+ data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
+ } else {
+ int i = rayBegin;
+ // Do the non aligned in front
+ for(;i<b;++i)
+ for(int j=0;j<3;j++)
+ data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
+ // Do the aligned in the middle
+ for(;i<e;i+=4)
+ for(int j=0;j<3;j++) {
+ _mm_store_ps(&data->inverseDirection[j][i],
+ oneOver(_mm_load_ps(&data->direction[j][i])));
+ }
+ // Do the non aligned in end
+ for(;i<rayEnd;++i)
+ for(int j=0;j<3;j++)
+ data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
}
#else
for(int i=rayBegin;i<rayEnd;i++)
for(int j=0;j<3;j++)
- data->inverseDirection[j][i] = 1./data->direction[j][i];
+ data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
#endif
flags |= HaveInverseDirections;
}
Modified: trunk/scenes/objviewer.cc
==============================================================================
--- trunk/scenes/objviewer.cc (original)
+++ trunk/scenes/objviewer.cc Tue Jun 20 16:05:02 2006
@@ -108,10 +108,11 @@
RealisticBvh_Build,
DynBVH_Build,
BVH_Build,
- GriddedGroup_Build
+ GriddedGroup_Build,
+ LinearGroup_Build
};
int which_BVH = RealisticBvh_Build;
-vector<string> BVH_args;
+vector<string> build_args;
///////////////////////////////////////////////////////////////////////////
// This function loads a specified .obj file into a runtime acceleration
@@ -161,8 +162,12 @@
if (!getStringArg(i, args, build))
throw IllegalArgument("objviewer -bvh_build
<type:naive,table>",
i, args);
- BVH_args.push_back("-build");
- BVH_args.push_back(build);
+ build_args.push_back("-build");
+ build_args.push_back(build);
+ }
+ else if (args[i] == "-linear" || args[i] == "-flatgroup") {
+ std::cout << "Doing Linear Group build\n";
+ which_BVH = LinearGroup_Build;
}
else if (args[i] == "-nocentering") {
center_object = false;
@@ -431,7 +436,7 @@
bvh_group = new DynBVH();
break;
case BVH_Build:
- bvh_group = new BVH(BVH_args);
+ bvh_group = new BVH(build_args);
break;
case GriddedGroup_Build:
{
@@ -441,6 +446,9 @@
bvh_group = new GriddedGroup(args);
}
break;
+ case LinearGroup_Build:
+ bvh_group = new Group(build_args);
+ break;
}
create_materials( model );
@@ -528,6 +536,7 @@
case DynBVH_Build:
case BVH_Build:
case GriddedGroup_Build:
+ case LinearGroup_Build:
// these cases just add
bvh_group->add(triangle);
break;
@@ -562,6 +571,7 @@
case DynBVH_Build:
case BVH_Build:
case GriddedGroup_Build:
+ case LinearGroup_Build:
bvh = bvh_group;
// Preprocesing will be done during the preprocessing phase
break;
- [MANTA] r1124 - in trunk: Engine/Display Image Interface scenes, no_author, 06/20/2006
Archive powered by MHonArc 2.6.16.