D3D12_SHADER_BYTECODE PSTextureEncoder::SetStaticShader(unsigned int dst_format, PEControl::PixelFormat src_format, bool is_intensity, bool scale_by_half) { size_t fetch_num = static_cast<size_t>(src_format); size_t scaled_fetch_num = scale_by_half ? 1 : 0; size_t intensity_num = is_intensity ? 1 : 0; size_t generator_num = dst_format; ComboKey key = MakeComboKey(dst_format, src_format, is_intensity, scale_by_half); ComboMap::iterator it = m_static_shaders_map.find(key); if (it == m_static_shaders_map.end()) { INFO_LOG(VIDEO, "Compiling efb encoding shader for dst_format 0x%X, src_format %d, " "is_intensity %d, scale_by_half %d", dst_format, static_cast<int>(src_format), is_intensity ? 1 : 0, scale_by_half ? 1 : 0); u32 format = dst_format; if (src_format == PEControl::Z24) { format |= _GX_TF_ZTF; if (dst_format == 11) format = GX_TF_Z16; else if (format < GX_TF_Z8 || format > GX_TF_Z24X8) format |= _GX_TF_CTF; } else { if (dst_format > GX_TF_RGBA8 || (dst_format < GX_TF_RGB565 && !is_intensity)) format |= _GX_TF_CTF; } ID3DBlob* bytecode = nullptr; const char* shader = TextureConversionShader::GenerateEncodingShader(format, APIType::D3D); if (!D3D::CompilePixelShader(shader, &bytecode)) { WARN_LOG(VIDEO, "EFB encoder shader for dst_format 0x%X, src_format %d, is_intensity %d, " "scale_by_half %d failed to compile", dst_format, static_cast<int>(src_format), is_intensity ? 1 : 0, scale_by_half ? 1 : 0); m_static_shaders_blobs[key] = {}; return {}; } D3D12_SHADER_BYTECODE new_shader = {bytecode->GetBufferPointer(), bytecode->GetBufferSize()}; it = m_static_shaders_map.emplace(key, new_shader).first; // Keep track of the ID3DBlobs, so we can free them upon shutdown. m_static_shaders_blobs.push_back(bytecode); } return it->second; }
ID3D11PixelShader* PSTextureEncoder::SetStaticShader(unsigned int dstFormat, PEControl::PixelFormat srcFormat, bool isIntensity, bool scaleByHalf) { size_t fetchNum = static_cast<size_t>(srcFormat); size_t scaledFetchNum = scaleByHalf ? 1 : 0; size_t intensityNum = isIntensity ? 1 : 0; size_t generatorNum = dstFormat; ComboKey key = MakeComboKey(dstFormat, srcFormat, isIntensity, scaleByHalf); ComboMap::iterator it = m_staticShaders.find(key); if (it == m_staticShaders.end()) { INFO_LOG(VIDEO, "Compiling efb encoding shader for dstFormat 0x%X, srcFormat %d, isIntensity %d, scaleByHalf %d", dstFormat, static_cast<int>(srcFormat), isIntensity ? 1 : 0, scaleByHalf ? 1 : 0); u32 format = dstFormat; if (srcFormat == PEControl::Z24) { format |= _GX_TF_ZTF; if (dstFormat == 11) format = GX_TF_Z16; else if (format < GX_TF_Z8 || format > GX_TF_Z24X8) format |= _GX_TF_CTF; } else { if (dstFormat > GX_TF_RGBA8 || (dstFormat < GX_TF_RGB565 && !isIntensity)) format |= _GX_TF_CTF; } D3DBlob* bytecode = nullptr; const char* shader = TextureConversionShader::GenerateEncodingShader(format, API_D3D); if (!D3D::CompilePixelShader(shader, &bytecode)) { WARN_LOG(VIDEO, "EFB encoder shader for dstFormat 0x%X, srcFormat %d, isIntensity %d, scaleByHalf %d failed to compile", dstFormat, static_cast<int>(srcFormat), isIntensity ? 1 : 0, scaleByHalf ? 1 : 0); m_staticShaders[key] = nullptr; return nullptr; } ID3D11PixelShader* newShader; HRESULT hr = D3D::device->CreatePixelShader(bytecode->Data(), bytecode->Size(), nullptr, &newShader); CHECK(SUCCEEDED(hr), "create efb encoder pixel shader"); it = m_staticShaders.insert(std::make_pair(key, newShader)).first; bytecode->Release(); } return it->second; }