Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}