Beispiel #1
0
    TextureTargetPtr TextureSystem::CreateTarget(const TextureTarget::Params& params)
    {
        ComPtr<ID3D11Resource> d3dResource;

        if (params.depth > 0)
        {
            D3D11_TEXTURE3D_DESC desc;
            desc.Width = params.width;
            desc.Height = params.height;
            desc.Depth = params.depth;
            desc.MipLevels = params.lastMip+1;
            desc.Format = TranslateFormat((TextureTarget::Format)params.format);
            desc.Usage = D3D11_USAGE_DEFAULT;
            desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
            desc.BindFlags |= IsDepthFormat((TextureTarget::Format)params.format) ? D3D11_BIND_DEPTH_STENCIL : 0;
            desc.CPUAccessFlags = (params.flags & TextureTarget::cFlag_CpuReadAccess) ? D3D11_CPU_ACCESS_READ : 0;
            desc.MiscFlags = 0;

            HRESULT hr = EngineCore::s_instance.device->CreateTexture3D(&desc, nullptr, (ID3D11Texture3D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
                return nullptr;
        }
        else
        {
            D3D11_TEXTURE2D_DESC desc;
            desc.Width = params.width;
            desc.Height = params.height;
            desc.MipLevels = params.lastMip+1;
            desc.ArraySize = params.arrayLength > 0 ? params.arrayLength : 1;
            desc.Format = TranslateFormat((TextureTarget::Format)params.format);
            desc.SampleDesc.Count = 1 << params.multisampling;
            desc.SampleDesc.Quality = 0;
            desc.Usage = D3D11_USAGE_DEFAULT;
            desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
            desc.BindFlags |= IsDepthFormat((TextureTarget::Format)params.format) ? D3D11_BIND_DEPTH_STENCIL : 0;
            desc.CPUAccessFlags = (params.flags & TextureTarget::cFlag_CpuReadAccess) ? D3D11_CPU_ACCESS_READ : 0;
            desc.MiscFlags = 0;

            HRESULT hr = EngineCore::s_instance.device->CreateTexture2D(&desc, nullptr, (ID3D11Texture2D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
                return nullptr;
        }

        Texture::Details* details = new(g_texturePool.Allocate()) Texture::Details((Texture::Params&)params);
        assert(details != nullptr);
        details->m_d3dResource.Swap(d3dResource);
        return (TextureTarget*)details;
    }
Beispiel #2
0
bool CPixelConverterRBP::Open(AVPixelFormat pixfmt, AVPixelFormat targetfmt, unsigned int width, unsigned int height)
{
  if (width == 0 || height == 0)
    return false;

  targetfmt = TranslateTargetFormat(pixfmt);

  CLog::Log(LOGDEBUG, "CPixelConverter::%s: pixfmt:%d(%s) targetfmt:%d(%s) %dx%d", __FUNCTION__, pixfmt, av_get_pix_fmt_name(pixfmt), targetfmt, av_get_pix_fmt_name(targetfmt), width, height);

  if (targetfmt == AV_PIX_FMT_NONE)
  {
    CLog::Log(LOGERROR, "%s: Invalid target pixel format: %d", __FUNCTION__, targetfmt);
    return false;
  }

  m_renderFormat = RENDER_FMT_MMAL;
  m_width = width;
  m_height = height;
  m_swsContext = sws_getContext(width, height, pixfmt,
                                width, height, targetfmt,
                                SWS_FAST_BILINEAR, NULL, NULL, NULL);
  if (!m_swsContext)
  {
    CLog::Log(LOGERROR, "%s: Failed to create swscale context", __FUNCTION__);
    return false;
  }

  m_mmal_format = TranslateFormat(targetfmt);

  if (m_mmal_format == MMAL_ENCODING_UNKNOWN)
    return false;

  /* Create dummy component with attached pool */
  m_pool = std::make_shared<CMMALPool>(MMAL_COMPONENT_DEFAULT_VIDEO_DECODER, false, MMAL_NUM_OUTPUT_BUFFERS, 0, MMAL_ENCODING_I420, MMALStateFFDec);

  return true;
}
Beispiel #3
0
    TexturePtr TextureSystem::CreateTexture(const Texture::Params& params)
    {
        ComPtr<ID3D11Resource> d3dResource;

        if (params.depth > 0)
        {
            D3D11_TEXTURE3D_DESC desc;
            desc.Width = params.width;
            desc.Height = params.height;
            desc.Depth = params.depth;
            desc.MipLevels = params.lastMip+1;
            desc.Format = TranslateFormat((Texture::Format)params.format);
            desc.Usage = (params.flags & Texture::cFlag_Dynamic) ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT;
            desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
            desc.CPUAccessFlags = (params.flags & Texture::cFlag_Dynamic) ? D3D11_CPU_ACCESS_WRITE : 0;
            desc.MiscFlags = 0;

            HRESULT hr = EngineCore::s_instance.device->CreateTexture3D(&desc, nullptr, (ID3D11Texture3D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
                return nullptr;
        }
        else if (params.height > 0)
        {
            D3D11_TEXTURE2D_DESC desc;
            desc.Width = params.width;
            desc.Height = params.height;
            desc.MipLevels = params.lastMip+1;
            desc.ArraySize = params.arrayLength > 0 ? params.arrayLength : 1;
            desc.Format = TranslateFormat((Texture::Format)params.format);
            desc.SampleDesc.Count = 1;
            desc.SampleDesc.Quality = 0;
            desc.Usage = (params.flags & Texture::cFlag_Dynamic) ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT;
            desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
            desc.CPUAccessFlags = (params.flags & Texture::cFlag_Dynamic) ? D3D11_CPU_ACCESS_WRITE : 0;
            desc.MiscFlags = (params.flags & Texture::cFlag_CubeMap) ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0;

            HRESULT hr = EngineCore::s_instance.device->CreateTexture2D(&desc, nullptr, (ID3D11Texture2D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
                return nullptr;
        }
        else
        {
            D3D11_TEXTURE1D_DESC desc;
            desc.Width = params.width;
            desc.MipLevels = params.lastMip+1;
            desc.ArraySize = params.arrayLength > 0 ? params.arrayLength : 1;
            desc.Format = TranslateFormat((Texture::Format)params.format);
            desc.Usage = (params.flags & Texture::cFlag_Dynamic) ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT;
            desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
            desc.CPUAccessFlags = (params.flags & Texture::cFlag_Dynamic) ? D3D11_CPU_ACCESS_WRITE : 0;
            desc.MiscFlags = 0;

            HRESULT hr = EngineCore::s_instance.device->CreateTexture1D(&desc, nullptr, (ID3D11Texture1D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
                return nullptr;
        }

        Texture::Details* details = new(g_texturePool.Allocate()) Texture::Details(params);
        assert(details != nullptr);
        details->m_d3dResource.Swap(d3dResource);
        return details;
    }