ComputeShaderPtr CompileCSFromFile(const wchar* path,
                                   const char* functionName,
                                   ShaderProfile profile,
                                   const CompileOptions& compileOptions,
                                   bool forceOptimization)
{
    return CompileFromFile(path, functionName, ShaderType::Compute, profile, compileOptions, forceOptimization);
}
void PostProcessHelper::Initialize()
{
    // Load the shaders
    std::wstring fullScreenTriPath = SampleFrameworkDir() + L"Shaders\\FullScreenTriangle.hlsl";
    fullScreenTriVS = CompileFromFile(fullScreenTriPath.c_str(), "FullScreenTriangleVS", ShaderType::Vertex);

    {
        D3D12_ROOT_PARAMETER1 rootParameters[NumRootParams] = {};

        rootParameters[RootParam_StandardDescriptors].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
        rootParameters[RootParam_StandardDescriptors].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
        rootParameters[RootParam_StandardDescriptors].DescriptorTable.pDescriptorRanges = DX12::StandardDescriptorRanges();
        rootParameters[RootParam_StandardDescriptors].DescriptorTable.NumDescriptorRanges = DX12::NumStandardDescriptorRanges;

        rootParameters[RootParam_SRVIndices].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
        rootParameters[RootParam_SRVIndices].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
        rootParameters[RootParam_SRVIndices].Descriptor.RegisterSpace = 0;
        rootParameters[RootParam_SRVIndices].Descriptor.ShaderRegister = 0;

        rootParameters[RootParam_AppSettings].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
        rootParameters[RootParam_AppSettings].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
        rootParameters[RootParam_AppSettings].Descriptor.RegisterSpace = 0;
        rootParameters[RootParam_AppSettings].Descriptor.ShaderRegister = AppSettings::CBufferRegister;

        D3D12_STATIC_SAMPLER_DESC staticSamplers[4] = {};
        staticSamplers[0] = DX12::GetStaticSamplerState(SamplerState::Point, 0);
        staticSamplers[1] = DX12::GetStaticSamplerState(SamplerState::LinearClamp, 1);
        staticSamplers[2] = DX12::GetStaticSamplerState(SamplerState::Linear, 2);
        staticSamplers[3] = DX12::GetStaticSamplerState(SamplerState::LinearBorder, 3);

        D3D12_ROOT_SIGNATURE_DESC1 rootSignatureDesc = {};
        rootSignatureDesc.NumParameters = ArraySize_(rootParameters);
        rootSignatureDesc.pParameters = rootParameters;
        rootSignatureDesc.NumStaticSamplers = ArraySize_(staticSamplers);
        rootSignatureDesc.pStaticSamplers = staticSamplers;
        rootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;

        DX12::CreateRootSignature(&rootSignature, rootSignatureDesc);
        rootSignature->SetName(L"PostProcessHelper");
    }
}
Esempio n. 3
0
bool CShader::CreateFromCompiledFile(EInputLayoutType type, const wchar* psPath, const wchar* vsPath, const wchar* gsPath, const wchar* dsPath, const wchar* hsPath)
{
    HRESULT hr;
    CompileFromFile(type, L"../assets/parallaxPS.fx", L"../assets/parallaxVS.fx");

//    D3DReadFileToBlob(vsPath, &m_vsBlob);

    std::ifstream vsStream(vsPath, std::ifstream::binary);
    if(vsStream.fail()) assert(false);

    std::string vsString((std::istreambuf_iterator<char>(vsStream)), std::istreambuf_iterator<char>());

    int vsSize = vsString.size();

    //      hr = GetDevice()->CreateVertexShader(m_vsBlob->GetBufferPointer(), m_vsBlob->GetBufferSize(), NULL, &m_vs);

    hr = GetDX11Device()->CreateVertexShader(vsString.c_str(), vsSize, NULL, &m_vs);


    if(FAILED(hr)) assert(false);

    switch(type)
    {
    case EInputLayoutType::Position:
        hr = GetDX11Device()->CreateInputLayout(layoutPos, ARRAYSIZE(layoutPos), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTexture:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTex, ARRAYSIZE(layoutPosTex), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTextureNormal:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTexNorm, ARRAYSIZE(layoutPosTexNorm), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTextureNormalTangentBinormal:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTexNormalBitangentTangent, ARRAYSIZE(layoutPosTexNormalBitangentTangent), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::PositionTextureNormalTangentSkinned:
        hr = GetDX11Device()->CreateInputLayout(layoutPosTexNormalTangentSkinned, ARRAYSIZE(layoutPosTexNormalTangentSkinned), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::BasicParticle:
        hr = GetDX11Device()->CreateInputLayout(basicParticlelayout, ARRAYSIZE(basicParticlelayout), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    case EInputLayoutType::TerrainLayout:
        hr = GetDX11Device()->CreateInputLayout(layoutTerrain, ARRAYSIZE(layoutTerrain), vsString.c_str(), vsSize, &m_inputLayout);
        break;
    }

    if(FAILED(hr)) assert(false);
    vsStream.close();

    ////////////////////////////////////////////

    std::ifstream psStream(psPath, std::ifstream::binary);
    if(psStream.fail()) assert(false);

    std::string psString((std::istreambuf_iterator<char>(psStream)), std::istreambuf_iterator<char>());

    int psSize = psString.size();

    hr = GetDX11Device()->CreatePixelShader(psString.c_str(), psSize, NULL, &m_ps);
    if(FAILED(hr)) assert(false);
    psStream.close();

    /////////////////////////////////////////////

    if(gsPath != nullptr)
    {
        std::ifstream gsStream(gsPath, std::ifstream::binary);
        if(gsStream.fail()) assert(false);

        std::string gsString((std::istreambuf_iterator<char>(gsStream)), std::istreambuf_iterator<char>());

        int gsSize = gsString.size();
        hr = GetDX11Device()->CreateGeometryShader(gsString.c_str(), gsSize, NULL, &m_gs);

        if(FAILED(hr)) assert(false);
        gsStream.close();
    }

    if(hsPath != nullptr)
    {
        std::ifstream hsStream(hsPath, std::ifstream::binary);
        if(hsStream.fail()) assert(false);

        std::string hsString((std::istreambuf_iterator<char>(hsStream)), std::istreambuf_iterator<char>());

        int hsSize = hsString.size();
        hr = GetDX11Device()->CreateHullShader(hsString.c_str(), hsSize, NULL, &m_hs);

        if(FAILED(hr)) assert(false);
        hsStream.close();
    }

    if(dsPath != nullptr)
    {
        std::ifstream dsStream(dsPath, std::ifstream::binary);
        if(dsStream.fail()) assert(false);

        std::string dsString((std::istreambuf_iterator<char>(dsStream)), std::istreambuf_iterator<char>());

        int dsSize = dsString.size();
        hr = GetDX11Device()->CreateDomainShader(dsString.c_str(), dsSize, NULL, &m_ds);

        if(FAILED(hr)) assert(false);
        dsStream.close();
    }
    return true;
}
Esempio n. 4
0
    /*************************************************************//**
     *
     *  @brief  初期化処理を行う
     *  @param  カメラ
     *  @param  テクスチャ情報
     *  @param  最大スプライト数
     *  @return 正常終了:true
     *  @return 異常終了:false
     *
     ****************************************************************/
    bool C_SpriteCreater::Initialize(const Camera::CameraPtr& prCamera,
                                     const Texture::TextureDataPtr& prTextureData,
                                     uint32_t maxSpriteCount)
    {
        // GLSLオブジェクトを作成し、保持
        if (!Shader::GLSL::C_GlslObjectManager::s_GetInstance()->GetGlslObject(Fixed::Shader::s_pGLSL_OBJECT_ID))
        {
            auto pGlslObject = Shader::GLSL::C_GlslObject::s_Create();

            if (pGlslObject->CompileFromFile(Fixed::Shader::s_pVERTEX_FILE_PATH, Shader::GLSL::Type::s_VERTEX) == false)
            {
                PrintLog("[ C_SpriteCreater::Initialize ] : 頂点シェーダーのコンパイルに失敗しました。\n");

                return false;
            }

            if (pGlslObject->CompileFromFile(Fixed::Shader::s_pGEOMETRY_FILE_PATH, Shader::GLSL::Type::s_GEOMETRY) == false)
            {
                PrintLog("[ C_SpriteCreater::Initialize ] : ジオメトリシェーダーのコンパイルに失敗しました。\n");

                return false;
            }

            if (pGlslObject->CompileFromFile(Fixed::Shader::s_pFRAGMENT_FILE_PATH, Shader::GLSL::Type::s_FRAGMENT) == false)
            {
                PrintLog("[ C_SpriteCreater::Initialize ] : フラグメントシェーダーのコンパイルに失敗しました。\n");

                return false;
            }

            if (pGlslObject->Link() == false)
            {
                PrintLog("[ C_SpriteCreater::Initialize ] : シェーダーのリンクに失敗しました。\n");

                return false;
            }

            pGlslObject_ = pGlslObject;
            Shader::GLSL::C_GlslObjectManager::s_GetInstance()->Entry(pGlslObject_, Fixed::Shader::s_pGLSL_OBJECT_ID);

            // サブルーチンのインデックスを取得
            subroutineIndices_[Camera::PERSPECTIVE] = pGlslObject_->GetSubroutineIndex(Shader::GLSL::Type::s_GEOMETRY, "PerspectiveProcess");
            subroutineIndices_[Camera::ORTHOGRAPHIC] = pGlslObject_->GetSubroutineIndex(Shader::GLSL::Type::s_GEOMETRY, "OrthographicProcess");
        }
        else
        {
            pGlslObject_ = Shader::GLSL::C_GlslObjectManager::s_GetInstance()->GetGlslObject(Fixed::Shader::s_pGLSL_OBJECT_ID).get();

            // サブルーチンのインデックスを取得
            subroutineIndices_[Camera::PERSPECTIVE] = pGlslObject_->GetSubroutineIndex(Shader::GLSL::Type::s_GEOMETRY, "PerspectiveProcess");
            subroutineIndices_[Camera::ORTHOGRAPHIC] = pGlslObject_->GetSubroutineIndex(Shader::GLSL::Type::s_GEOMETRY, "OrthographicProcess");
        }

        // 頂点のメモリを確保
        vertices_.resize(maxSpriteCount);

        // プリミティブを作成し、取得
        if (!OpenGL::C_PrimitiveBufferManager::s_GetInstance()->GetPrimitiveBuffer(Fixed::Primitive::s_pSPRITE_ID))
        {
            uint32_t vertexAttributeElementCountList[] = { 3, 2, 1, 4, 2, 2, 2 };
            std::array<OpenGL::DataEnum, 7> vertexAttributeDataTypeList;
            vertexAttributeDataTypeList.fill(OpenGL::DataType::s_FLOAT);
            uint32_t vertexByteOffsetList[] = { 4, 4, 4, 4, 4, 4, 4 };
            bool vertexTransferFlagList[] = { true, true, true, true, true, true, true };

            pPointDatas_ = OpenGL::C_PrimitiveBuffer::s_Create(vertices_.data(),        
                                                               vertices_.size(),
                                                               7, 
                                                               vertexAttributeElementCountList,
                                                               vertexAttributeDataTypeList.data(),
                                                               OpenGL::Modify::s_DYNAMIC,
                                                               vertexByteOffsetList,
                                                               vertexTransferFlagList);

            OpenGL::C_PrimitiveBufferManager::s_GetInstance()->Entry(pPointDatas_, Fixed::Primitive::s_pSPRITE_ID);
        }
        else
        {
            pPointDatas_ = OpenGL::C_PrimitiveBufferManager::s_GetInstance()->GetPrimitiveBuffer(Fixed::Primitive::s_pSPRITE_ID).get();
        }

        // カメラとテクスチャ情報を設定
        pCamera_ = prCamera;
        pTextureData_ = prTextureData;

        // テクスチャユニットを設定
        pGlslObject_->Begin();
        pGlslObject_->SetUniform1i("texture", Fixed::Texture::s_UNIT_NUMBER);
        pGlslObject_->End();

        return true;
    }
Esempio n. 5
0
void Initialize_Upload()
{
    for(uint64 i = 0; i < MaxUploadSubmissions; ++i)
        DXCall(Device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_COPY, IID_PPV_ARGS(&UploadSubmissions[i].CmdAllocator)));

    DXCall(Device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_COPY, UploadSubmissions[0].CmdAllocator, nullptr, IID_PPV_ARGS(&UploadCmdList)));
    DXCall(UploadCmdList->Close());

    D3D12_COMMAND_QUEUE_DESC queueDesc = { };
    queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
    queueDesc.Type = D3D12_COMMAND_LIST_TYPE_COPY;
    DXCall(Device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&UploadCmdQueue)));

    UploadFence.Init(0);

    D3D12_RESOURCE_DESC resourceDesc = { };
    resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
    resourceDesc.Width = uint32(UploadBufferSize);
    resourceDesc.Height = 1;
    resourceDesc.DepthOrArraySize = 1;
    resourceDesc.MipLevels = 1;
    resourceDesc.Format = DXGI_FORMAT_UNKNOWN;
    resourceDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
    resourceDesc.SampleDesc.Count = 1;
    resourceDesc.SampleDesc.Quality = 0;
    resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
    resourceDesc.Alignment = 0;

    DXCall(Device->CreateCommittedResource(DX12::GetUploadHeapProps(), D3D12_HEAP_FLAG_NONE, &resourceDesc,
                                           D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&UploadBuffer)));

    D3D12_RANGE readRange = { };
    DXCall(UploadBuffer->Map(0, &readRange, reinterpret_cast<void**>(&UploadBufferCPUAddr)));

    // Temporary buffer memory that swaps every frame
    resourceDesc.Width = uint32(TempBufferSize);

    for(uint64 i = 0; i < RenderLatency; ++i)
    {
        DXCall(Device->CreateCommittedResource(DX12::GetUploadHeapProps(), D3D12_HEAP_FLAG_NONE, &resourceDesc,
                                               D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&TempFrameBuffers[i])));

        DXCall(TempFrameBuffers[i]->Map(0, &readRange, reinterpret_cast<void**>(&TempFrameCPUMem[i])));
        TempFrameGPUMem[i] = TempFrameBuffers[i]->GetGPUVirtualAddress();
    }

    // Texture conversion resources
    DXCall(Device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_COMPUTE, IID_PPV_ARGS(&convertCmdAllocator)));
    DXCall(Device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_COMPUTE, convertCmdAllocator, nullptr, IID_PPV_ARGS(&convertCmdList)));
    DXCall(convertCmdList->Close());
    DXCall(convertCmdList->Reset(convertCmdAllocator, nullptr));

    D3D12_COMMAND_QUEUE_DESC convertQueueDesc = {};
    convertQueueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
    convertQueueDesc.Type = D3D12_COMMAND_LIST_TYPE_COMPUTE;
    DXCall(Device->CreateCommandQueue(&convertQueueDesc, IID_PPV_ARGS(&convertCmdQueue)));

    CompileOptions opts;
    opts.Add("TGSize_", convertTGSize);
    const std::wstring shaderPath = SampleFrameworkDir() + L"Shaders\\DecodeTextureCS.hlsl";
    convertCS = CompileFromFile(shaderPath.c_str(), "DecodeTextureCS", ShaderType::Compute, ShaderProfile::SM51, opts);
    convertArrayCS = CompileFromFile(shaderPath.c_str(), "DecodeTextureArrayCS", ShaderType::Compute, ShaderProfile::SM51, opts);

    {
        D3D12_DESCRIPTOR_RANGE ranges[2] = {};
        ranges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
        ranges[0].NumDescriptors = 1;
        ranges[0].BaseShaderRegister = 0;
        ranges[0].RegisterSpace = 0;
        ranges[0].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;

        ranges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
        ranges[1].NumDescriptors = 1;
        ranges[1].BaseShaderRegister = 0;
        ranges[1].RegisterSpace = 0;
        ranges[1].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;

        D3D12_ROOT_PARAMETER rootParameters[1] = {};
        rootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
        rootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
        rootParameters[0].DescriptorTable.pDescriptorRanges = ranges;
        rootParameters[0].DescriptorTable.NumDescriptorRanges = ArraySize_(ranges);

        D3D12_ROOT_SIGNATURE_DESC rootSignatureDesc = {};
        rootSignatureDesc.NumParameters = ArraySize_(rootParameters);
        rootSignatureDesc.pParameters = rootParameters;
        rootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;

        DX12::CreateRootSignature(&convertRootSignature, rootSignatureDesc);
    }

    {
        D3D12_COMPUTE_PIPELINE_STATE_DESC psoDesc = { };
        psoDesc.CS = convertCS.ByteCode();
        psoDesc.pRootSignature = convertRootSignature;
        psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
        Device->CreateComputePipelineState(&psoDesc, IID_PPV_ARGS(&convertPSO));

        psoDesc.CS = convertArrayCS.ByteCode();
        Device->CreateComputePipelineState(&psoDesc, IID_PPV_ARGS(&convertArrayPSO));
    }

    convertFence.Init(0);

    // Readback resources
    DXCall(Device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_COPY, IID_PPV_ARGS(&readbackCmdAllocator)));
    DXCall(Device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_COPY, readbackCmdAllocator, nullptr, IID_PPV_ARGS(&readbackCmdList)));
    DXCall(readbackCmdList->Close());
    DXCall(readbackCmdList->Reset(readbackCmdAllocator, nullptr));

    readbackFence.Init(0);
}