Ticket #4549: nvtt-engine.diff
File nvtt-engine.diff, 3.8 KB (added by , 4 years ago) |
---|
-
source/graphics/TextureConverter.cpp
52 52 memcpy(&buffer[off], data, size); 53 53 return true; 54 54 } 55 56 virtual void endImage() 57 { 58 } 55 59 }; 56 60 57 61 /** … … 64 68 nvtt::InputOptions inputOptions; 65 69 nvtt::CompressionOptions compressionOptions; 66 70 nvtt::OutputOptions outputOptions; 67 bool isDXT1a; // see comment in RunThread68 bool is8bpp;69 71 }; 70 72 71 73 /** … … 383 385 else 384 386 request->inputOptions.setAlphaMode(nvtt::AlphaMode_None); 385 387 386 request->isDXT1a = false;387 request->is8bpp = false;388 389 388 if (settings.format == FMT_RGBA) 390 389 { 391 390 request->compressionOptions.setFormat(nvtt::Format_RGBA); … … 396 395 { 397 396 request->compressionOptions.setFormat(nvtt::Format_RGBA); 398 397 request->compressionOptions.setPixelFormat(8, 0x00, 0x00, 0x00, 0xFF); 399 request->is8bpp = true;400 398 } 401 399 else if (!hasAlpha) 402 400 { … … 406 404 else if (settings.format == FMT_DXT1) 407 405 { 408 406 request->compressionOptions.setFormat(nvtt::Format_DXT1a); 409 request->isDXT1a = true;410 407 } 411 408 else if (settings.format == FMT_DXT3) 412 409 { … … 578 575 result->ret = compressor.process(request->inputOptions, request->compressionOptions, request->outputOptions); 579 576 } 580 577 581 // Ugly hack: NVTT 2.0 doesn't set DDPF_ALPHAPIXELS for DXT1a, so we can't582 // distinguish it from DXT1. (It's fixed in trunk by583 // http://code.google.com/p/nvidia-texture-tools/source/detail?r=924&path=/trunk).584 // Rather than using a trunk NVTT (unstable, makes packaging harder)585 // or patching our copy (makes packaging harder), we'll just manually586 // set the flag here.587 if (request->isDXT1a && result->ret && result->output.buffer.size() > 80)588 result->output.buffer[80] |= 1; // DDPF_ALPHAPIXELS in DDS_PIXELFORMAT.dwFlags589 // Ugly hack: NVTT always sets DDPF_RGB, even if we're trying to output 8-bit590 // alpha-only DDS with no RGB components. Unset that flag.591 if (request->is8bpp)592 result->output.buffer[80] &= ~0x40; // DDPF_RGB in DDS_PIXELFORMAT.dwFlags593 594 578 // Push the result onto the queue 595 579 std::lock_guard<std::mutex> wait_lock(textureConverter->m_WorkerMutex); 596 580 textureConverter->m_ResultQueue.push_back(result); -
source/lib/tex/tex_dds.cpp
310 310 311 311 // DDS_PIXELFORMAT.dwFlags 312 312 // we've seen some DXT3 files that don't have this set (which is nonsense; 313 // any image lacking alpha should be stored as DXT1). it's authoritative 314 // if fourcc is DXT1 (there's no other way to tell DXT1 and DXT1a apart) 315 // and ignored otherwise. 313 // any image lacking alpha should be stored as DXT1). 316 314 #define DDPF_ALPHAPIXELS 0x00000001 315 // DDPF_ALPHA is used instead of DDPF_ALPHAPIXELS for DXT1a. 316 #define DDPF_ALPHA 0x00000002 317 317 #define DDPF_FOURCC 0x00000004 318 318 #define DDPF_RGB 0x00000040 319 319 … … 326 326 u32 dwRBitMask; 327 327 u32 dwGBitMask; 328 328 u32 dwBBitMask; 329 u32 dwABitMask; // (DDPF_ALPHA PIXELS)329 u32 dwABitMask; // (DDPF_ALPHA or DDPF_ALPHAPIXELS) 330 330 }; 331 331 332 332 … … 435 435 RETURN_STATUS_IF_ERR(tex_validate_plain_format(bpp, (int)flags)); 436 436 } 437 437 // .. uncompressed 8bpp greyscale 438 else if(pf_flags & DDPF_ALPHA PIXELS)438 else if(pf_flags & DDPF_ALPHA) 439 439 { 440 440 const size_t pf_bpp = (size_t)read_le32(&pf->dwRGBBitCount); 441 441 const size_t pf_a_mask = (size_t)read_le32(&pf->dwABitMask); … … 460 460 { 461 461 case FOURCC('D','X','T','1'): 462 462 bpp = 4; 463 if(pf_flags & DDPF_ALPHA PIXELS)463 if(pf_flags & DDPF_ALPHA) 464 464 flags |= DXT1A | TEX_ALPHA; 465 465 else 466 466 flags |= 1;