Fix build under OSX with clang. Fixes issue 180.

pull/216/head
castano 12 years ago
parent 15f5e19d40
commit 1d8d067caf

@ -203,6 +203,9 @@ Metrowerks:
- __INTEL__ for x86 targets
- __POWERPC__
LLVM:
- __llvm__
- __clang__
*/
/*
@ -237,9 +240,9 @@ Metrowerks:
#if defined __clang__
# define POSH_COMPILER_STRING "Clang"
# define POSH_COMPILER_CLANG 1
#endif
#elif defined __GNUC__
#if defined __GNUC__ && !defined __clang__
# define POSH_COMPILER_STRING "Gnu GCC"
# define POSH_COMPILER_GCC 1
#endif

@ -486,10 +486,11 @@ namespace
#endif
}
static void printStackTrace(void * trace[], int size, int start=0) {
static void writeStackTrace(void * trace[], int size, int start, Array<const char *> & lines) {
StringBuilder builder(512);
char ** string_array = backtrace_symbols(trace, size);
nvDebug( "\nDumping stacktrace:\n" );
for(int i = start; i < size-1; i++ ) {
# if NV_CC_GNUC // defined(HAVE_CXXABI_H)
// @@ Write a better parser for the possible formats.
@ -510,34 +511,48 @@ namespace
char * name = abi::__cxa_demangle(begin+1, 0, 0, &stat);
if (module == NULL) {
if (name == NULL || stat != 0) {
nvDebug( " In: '%s'\n", begin+1 );
builder.format(" In: '%s'\n", begin+1);
}
else {
nvDebug( " In: '%s'\n", name );
builder.format(" In: '%s'\n", name);
}
}
else {
if (name == NULL || stat != 0) {
nvDebug( " In: [%s] '%s'\n", module, begin+1 );
builder.format(" In: [%s] '%s'\n", module, begin+1);
}
else {
nvDebug( " In: [%s] '%s'\n", module, name );
builder.format(" In: [%s] '%s'\n", module, name);
}
}
free(name);
}
else {
nvDebug( " In: '%s'\n", string_array[i] );
builder.format(" In: '%s'\n", string_array[i]);
}
# else
nvDebug( " In: '%s'\n", string_array[i] );
builder.format(" In: '%s'\n", string_array[i]);
# endif
lines.append(builder.release());
}
nvDebug("\n");
free(string_array);
}
static void printStackTrace(void * trace[], int size, int start=0) {
nvDebug( "\nDumping stacktrace:\n" );
Array<const char *> lines;
writeStackTrace(trace, size, 1, lines);
for (uint i = 0; i < lines.count(); i++) {
nvDebug(lines[i]);
delete lines[i];
}
nvDebug("\n");
}
#endif // defined(HAVE_EXECINFO_H)
static void * callerAddress(void * secret)
@ -818,6 +833,7 @@ int nvAbort(const char * exp, const char * file, int line, const char * func/*=N
// Abnormal termination. Create mini dump and output call stack.
void debug::terminate(int code)
{
#if NV_OS_WIN32
EnterCriticalSection(&s_handler_critical_section);
writeMiniDump(NULL);
@ -843,6 +859,7 @@ void debug::terminate(int code)
}
LeaveCriticalSection(&s_handler_critical_section);
#endif
exit(code);
}
@ -908,6 +925,7 @@ void debug::resetAssertHandler()
}
#if NV_OS_WIN32
#if USE_SEPARATE_THREAD
static void initHandlerThread()
@ -951,7 +969,8 @@ static void shutHandlerThread() {
// @@ Free stuff. Terminate thread.
}
#endif
#endif // USE_SEPARATE_THREAD
#endif // NV_OS_WIN32
// Enable signal handler.

@ -32,21 +32,28 @@
#else // NV_NO_ASSERT
# if NV_CC_MSVC
// @@ Does this work in msvc-6 and earlier?
// @@ Does this work in msvc-6 and earlier?
# define nvDebugBreak() __debugbreak()
//# define nvDebugBreak() __asm { int 3 }
# elif NV_CC_GNUC && NV_CPU_PPC && NV_OS_DARWIN
// @@ Use __builtin_trap() on GCC
# define nvDebugBreak() __asm__ volatile ("trap");
# elif NV_CC_GNUC && NV_CPU_X86 && NV_OS_DARWIN
# define nvDebugBreak() __asm__ volatile ("int3");
# elif NV_CC_GNUC && NV_CPU_X86
//#define nvDebugBreak() __asm { int 3 }
# elif NV_CC_GNUC
# define nvDebugBreak() __builtin_trap()
# else
# error "No nvDebugBreak()!"
# endif
/*
# elif NV_CC_GNUC || NV_CPU_PPC && NV_OS_DARWIN
// @@ Use __builtin_trap() on GCC
# define nvDebugBreak() __asm__ volatile ("trap")
# elif (NV_CC_GNUC || NV_CPU_X86 || NV_CPU_X86_64) && NV_OS_DARWIN
# define nvDebugBreak() __asm__ volatile ("int3")
# elif NV_CC_GNUC || NV_CPU_X86 || NV_CPU_X86_64
# define nvDebugBreak() __asm__ ( "int %0" : :"I"(3) )
# else
# include <signal.h>
# define nvDebugBreak() raise(SIGTRAP);
// define nvDebugBreak() *((int *)(0)) = 0
# define nvDebugBreak() raise(SIGTRAP)
# endif
*/
#define nvDebugBreakOnce() \
NV_MULTI_LINE_MACRO_BEGIN \

@ -25,7 +25,7 @@
#endif
#define NV_FASTCALL __attribute__((fastcall))
#define NV_FORCEINLINE __attribute__((always_inline))
#define NV_FORCEINLINE inline __attribute__((always_inline))
#define NV_DEPRECATED __attribute__((deprecated))
#if __GNUC__ > 2

@ -343,9 +343,10 @@ namespace
case DXGI_FORMAT_B8G8R8X8_TYPELESS:
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
return 8*4;
default:
return 0;
}
return 0;
nvUnreachable();
}
} // namespace

@ -349,8 +349,8 @@ float nv::averageAngularError(const FloatImage * img0, const FloatImage * img1)
Vector3 n0 = Vector3(x0[i], y0[i], z0[i]);
Vector3 n1 = Vector3(x1[i], y1[i], z1[i]);
n0 = 2 * n0 - Vector3(1);
n1 = 2 * n1 - Vector3(1);
n0 = 2.0f * n0 - Vector3(1);
n1 = 2.0f * n1 - Vector3(1);
n0 = normalizeSafe(n0, Vector3(0), 0.0f);
n1 = normalizeSafe(n1, Vector3(0), 0.0f);
@ -387,8 +387,8 @@ float nv::rmsAngularError(const FloatImage * img0, const FloatImage * img1)
Vector3 n0 = Vector3(x0[i], y0[i], z0[i]);
Vector3 n1 = Vector3(x1[i], y1[i], z1[i]);
n0 = 2 * n0 - Vector3(1);
n1 = 2 * n1 - Vector3(1);
n0 = 2.0f * n0 - Vector3(1);
n1 = 2.0f * n1 - Vector3(1);
n0 = normalizeSafe(n0, Vector3(0), 0.0f);
n1 = normalizeSafe(n1, Vector3(0), 0.0f);

@ -411,8 +411,8 @@ int nv::Fit::compute4Means(int n, const Vector3 *__restrict points, const float
cluster[0] = centroid + mindps * principal;
cluster[1] = centroid + maxdps * principal;
cluster[2] = (2 * cluster[0] + cluster[1]) / 3;
cluster[3] = (2 * cluster[1] + cluster[0]) / 3;
cluster[2] = (2.0f * cluster[0] + cluster[1]) / 3.0f;
cluster[3] = (2.0f * cluster[1] + cluster[0]) / 3.0f;
// Now we have to iteratively refine the clusters.
while (true)

@ -21,7 +21,7 @@ SET(NVTT_SRCS
CompressionOptions.h CompressionOptions.cpp
InputOptions.h InputOptions.cpp
OutputOptions.h OutputOptions.cpp
TaskDispatcher.h TaskDispatcher.cpp
TaskDispatcher.h #TaskDispatcher.cpp
Surface.h Surface.cpp
CubeSurface.h CubeSurface.cpp
cuda/CudaUtils.h cuda/CudaUtils.cpp

@ -523,6 +523,30 @@ Vector3 CubeSurface::Private::applyCosinePowerFilter(const Vector3 & filterDir,
int x0 = 0, x1 = L;
int y0 = 0, y1 = L;
if (false) {
// New approach?
// For each face, we are looking for 4 planes that bound the cone.
// All planes go through the origin.
// Plane fully determined by its normal.
// We only care about planes aligned to one axis. So, for the XY face, we have 4 planes:
// Plane goes through origin.
// Plane normal is unit length.
// Plane must be tangent to cone ->
// angle between plane normal and cone axis is 90 - cone angle & 90 + cone angle
// dot(N, D) == cos(90 - cone angle)
// dot(N, D) == cos(90 + cone angle)
// Plane must contain face UV axis
// Find the 4 planes and how they intersect the unit face, which gives us (u0,v0, u1,v1).
// Expand uv coordinates, clamp to
}
// @@ Ugh. This is wrong, or only right when filterDir is aligned to one axis.
if (false) {
// uv coordinates corresponding to filterDir.

@ -83,7 +83,7 @@ inline static void findMinMaxColorsBox(const Vector3 * block, uint num, Vector3
inline static void selectDiagonal(const Vector3 * block, uint num, Vector3 * restrict maxColor, Vector3 * restrict minColor)
{
Vector3 center = (*maxColor + *minColor) * 0.5;
Vector3 center = (*maxColor + *minColor) * 0.5f;
Vector2 covariance = Vector2(0.0f);
for (uint i = 0; i < num; i++)
@ -714,8 +714,8 @@ void QuickCompress::compressDXT5(const ColorBlock & rgba, BlockDXT5 * dxtBlock,
void QuickCompress::outputBlock4(const ColorSet & set, const Vector3 & start, const Vector3 & end, BlockDXT1 * block)
{
Vector3 minColor = start * 255;
Vector3 maxColor = end * 255;
Vector3 minColor = start * 255.0f;
Vector3 maxColor = end * 255.0f;
uint16 color0 = roundAndExpand(&maxColor);
uint16 color1 = roundAndExpand(&minColor);
@ -727,15 +727,15 @@ void QuickCompress::outputBlock4(const ColorSet & set, const Vector3 & start, co
block->col0 = Color16(color0);
block->col1 = Color16(color1);
block->indices = computeIndices4(set, maxColor / 255, minColor / 255);
block->indices = computeIndices4(set, maxColor / 255.0f, minColor / 255.0f);
//optimizeEndPoints4(set, block);
}
void QuickCompress::outputBlock3(const ColorSet & set, const Vector3 & start, const Vector3 & end, BlockDXT1 * block)
{
Vector3 minColor = start * 255;
Vector3 maxColor = end * 255;
Vector3 minColor = start * 255.0f;
Vector3 maxColor = end * 255.0f;
uint16 color0 = roundAndExpand(&minColor);
uint16 color1 = roundAndExpand(&maxColor);
@ -747,7 +747,7 @@ void QuickCompress::outputBlock3(const ColorSet & set, const Vector3 & start, co
block->col0 = Color16(color0);
block->col1 = Color16(color1);
block->indices = computeIndices3(set, maxColor / 255, minColor / 255);
block->indices = computeIndices3(set, maxColor / 255.0f, minColor / 255.0f);
//optimizeEndPoints3(set, block);
}

@ -33,6 +33,7 @@
#include <nvcore/TextWriter.h>
#include <nvcore/FileSystem.h>
#include <nvcore/Timer.h>
#include <nvcore/Array.inl>
#include <stdlib.h> // free
#include <string.h> // memcpy

@ -105,6 +105,7 @@ GLuint createTexture(nv::DirectDrawSurface & dds)
else {
// Add support for cubemaps.
}
return tex;
}
void drawQuad()

@ -24,6 +24,7 @@
#include <nvcore/Ptr.h>
#include <nvcore/StrLib.h>
#include <nvcore/StdStream.h>
#include <nvcore/Array.inl>
#include <nvimage/Image.h>
#include <nvimage/ImageIO.h>

Loading…
Cancel
Save