Ticket #4549: nvtt-engine.diff

File nvtt-engine.diff, 3.8 KB (added by Itms, 4 years ago)

Patch for the engine code

  • source/graphics/TextureConverter.cpp

     
    5252        memcpy(&buffer[off], data, size);
    5353        return true;
    5454    }
     55
     56    virtual void endImage()
     57    {
     58    }
    5559};
    5660
    5761/**
     
    6468    nvtt::InputOptions inputOptions;
    6569    nvtt::CompressionOptions compressionOptions;
    6670    nvtt::OutputOptions outputOptions;
    67     bool isDXT1a; // see comment in RunThread
    68     bool is8bpp;
    6971};
    7072
    7173/**
     
    383385    else
    384386        request->inputOptions.setAlphaMode(nvtt::AlphaMode_None);
    385387
    386     request->isDXT1a = false;
    387     request->is8bpp = false;
    388 
    389388    if (settings.format == FMT_RGBA)
    390389    {
    391390        request->compressionOptions.setFormat(nvtt::Format_RGBA);
     
    396395    {
    397396        request->compressionOptions.setFormat(nvtt::Format_RGBA);
    398397        request->compressionOptions.setPixelFormat(8, 0x00, 0x00, 0x00, 0xFF);
    399         request->is8bpp = true;
    400398    }
    401399    else if (!hasAlpha)
    402400    {
     
    406404    else if (settings.format == FMT_DXT1)
    407405    {
    408406        request->compressionOptions.setFormat(nvtt::Format_DXT1a);
    409         request->isDXT1a = true;
    410407    }
    411408    else if (settings.format == FMT_DXT3)
    412409    {
     
    578575            result->ret = compressor.process(request->inputOptions, request->compressionOptions, request->outputOptions);
    579576        }
    580577
    581         // Ugly hack: NVTT 2.0 doesn't set DDPF_ALPHAPIXELS for DXT1a, so we can't
    582         // distinguish it from DXT1. (It's fixed in trunk by
    583         // 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 manually
    586         // 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.dwFlags
    589         // Ugly hack: NVTT always sets DDPF_RGB, even if we're trying to output 8-bit
    590         // 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.dwFlags
    593 
    594578        // Push the result onto the queue
    595579        std::lock_guard<std::mutex> wait_lock(textureConverter->m_WorkerMutex);
    596580        textureConverter->m_ResultQueue.push_back(result);
  • source/lib/tex/tex_dds.cpp

     
    310310
    311311// DDS_PIXELFORMAT.dwFlags
    312312// 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).
    316314#define DDPF_ALPHAPIXELS 0x00000001
     315// DDPF_ALPHA is used instead of DDPF_ALPHAPIXELS for DXT1a.
     316#define DDPF_ALPHA       0x00000002
    317317#define DDPF_FOURCC      0x00000004
    318318#define DDPF_RGB         0x00000040
    319319
     
    326326    u32 dwRBitMask;
    327327    u32 dwGBitMask;
    328328    u32 dwBBitMask;
    329     u32 dwABitMask;                   // (DDPF_ALPHAPIXELS)
     329    u32 dwABitMask;                   // (DDPF_ALPHA or DDPF_ALPHAPIXELS)
    330330};
    331331
    332332
     
    435435        RETURN_STATUS_IF_ERR(tex_validate_plain_format(bpp, (int)flags));
    436436    }
    437437    // .. uncompressed 8bpp greyscale
    438     else if(pf_flags & DDPF_ALPHAPIXELS)
     438    else if(pf_flags & DDPF_ALPHA)
    439439    {
    440440        const size_t pf_bpp    = (size_t)read_le32(&pf->dwRGBBitCount);
    441441        const size_t pf_a_mask = (size_t)read_le32(&pf->dwABitMask);
     
    460460        {
    461461        case FOURCC('D','X','T','1'):
    462462            bpp = 4;
    463             if(pf_flags & DDPF_ALPHAPIXELS)
     463            if(pf_flags & DDPF_ALPHA)
    464464                flags |= DXT1A | TEX_ALPHA;
    465465            else
    466466                flags |= 1;