summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/src/libANGLE/renderer/ShaderImpl.cpp
blob: eb20adcfde0569770ea4a4a3aa18eca9a92f2cd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// ShaderImpl.cpp: Implementation methods of ShaderImpl

#include "libANGLE/renderer/ShaderImpl.h"

#include "libANGLE/Context.h"
#include "libANGLE/trace.h"

namespace rx
{

WaitableCompileEvent::WaitableCompileEvent(std::shared_ptr<angle::WaitableEvent> waitableEvent)
    : mWaitableEvent(waitableEvent)
{}

WaitableCompileEvent::~WaitableCompileEvent()
{
    mWaitableEvent.reset();
}

void WaitableCompileEvent::wait()
{
    mWaitableEvent->wait();
}

bool WaitableCompileEvent::isReady()
{
    return mWaitableEvent->isReady();
}

const std::string &WaitableCompileEvent::getInfoLog()
{
    return mInfoLog;
}

class TranslateTask : public angle::Closure
{
  public:
    TranslateTask(ShHandle handle, const ShCompileOptions &options, const std::string &source)
        : mHandle(handle), mOptions(options), mSource(source), mResult(false)
    {}

    void operator()() override
    {
        ANGLE_TRACE_EVENT1("gpu.angle", "TranslateTask::run", "source", mSource);
        const char *source = mSource.c_str();
        mResult            = sh::Compile(mHandle, &source, 1, mOptions);
    }

    bool getResult() { return mResult; }

    ShHandle getHandle() { return mHandle; }

  private:
    ShHandle mHandle;
    ShCompileOptions mOptions;
    std::string mSource;
    bool mResult;
};

class WaitableCompileEventImpl final : public WaitableCompileEvent
{
  public:
    WaitableCompileEventImpl(std::shared_ptr<angle::WaitableEvent> waitableEvent,
                             std::shared_ptr<TranslateTask> translateTask)
        : WaitableCompileEvent(waitableEvent), mTranslateTask(translateTask)
    {}

    bool getResult() override { return mTranslateTask->getResult(); }

    bool postTranslate(std::string *infoLog) override { return true; }

  private:
    std::shared_ptr<TranslateTask> mTranslateTask;
};

std::shared_ptr<WaitableCompileEvent> ShaderImpl::compileImpl(
    const gl::Context *context,
    gl::ShCompilerInstance *compilerInstance,
    const std::string &source,
    ShCompileOptions *compileOptions)
{
#if defined(ANGLE_ENABLE_ASSERTS)
    compileOptions->validateAST = true;
#endif

    auto workerThreadPool = context->getShaderCompileThreadPool();
    auto translateTask =
        std::make_shared<TranslateTask>(compilerInstance->getHandle(), *compileOptions, source);

    return std::make_shared<WaitableCompileEventImpl>(
        angle::WorkerThreadPool::PostWorkerTask(workerThreadPool, translateTask), translateTask);
}

angle::Result ShaderImpl::onLabelUpdate(const gl::Context *context)
{
    return angle::Result::Continue;
}

}  // namespace rx