Commit 63fa2e94 by Jamie Madill Committed by Commit Bot

D3D11: Consolidate Query allocation.

This compiles the resource refactor for D3D11. The only remaining non-smart handles are for things like SwapChains and ID3D11Blob. This might be more easily managed by using angle::ComPtr or similar smart pointers instead of the Resource Manager class. BUG=angleproject:2034 Change-Id: I53c753a1c19b05c4e72859dd5046e3ed10866847 Reviewed-on: https://chromium-review.googlesource.com/506777Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 0fd806f1
......@@ -48,16 +48,12 @@ GLuint64 MergeQueryResults(GLenum type, GLuint64 currentResult, GLuint64 newResu
namespace rx
{
Query11::QueryState::QueryState()
: query(nullptr), beginTimestamp(nullptr), endTimestamp(nullptr), finished(false)
Query11::QueryState::QueryState() : query(), beginTimestamp(), endTimestamp(), finished(false)
{
}
Query11::QueryState::~QueryState()
{
SafeRelease(beginTimestamp);
SafeRelease(endTimestamp);
SafeRelease(query);
}
Query11::Query11(Renderer11 *renderer, GLenum type)
......@@ -95,7 +91,7 @@ gl::Error Query11::queryCounter()
template <typename T>
gl::Error Query11::getResultBase(T *params)
{
ASSERT(mActiveQuery->query == nullptr);
ASSERT(!mActiveQuery->query.valid());
ANGLE_TRY(flush(true));
ASSERT(mPendingQueries.empty());
*params = static_cast<T>(mResultSum);
......@@ -133,7 +129,7 @@ gl::Error Query11::isResultAvailable(bool *available)
gl::Error Query11::pause()
{
if (mActiveQuery->query != nullptr)
if (mActiveQuery->query.valid())
{
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
GLenum queryType = getType();
......@@ -141,10 +137,10 @@ gl::Error Query11::pause()
// If we are doing time elapsed query the end timestamp
if (queryType == GL_TIME_ELAPSED_EXT)
{
context->End(mActiveQuery->endTimestamp);
context->End(mActiveQuery->endTimestamp.get());
}
context->End(mActiveQuery->query);
context->End(mActiveQuery->query.get());
mPendingQueries.push_back(std::move(mActiveQuery));
mActiveQuery = std::unique_ptr<QueryState>(new QueryState());
......@@ -155,7 +151,7 @@ gl::Error Query11::pause()
gl::Error Query11::resume()
{
if (mActiveQuery->query == nullptr)
if (!mActiveQuery->query.valid())
{
ANGLE_TRY(flush(false));
......@@ -166,14 +162,7 @@ gl::Error Query11::resume()
queryDesc.Query = d3dQueryType;
queryDesc.MiscFlags = 0;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateQuery(&queryDesc, &mActiveQuery->query);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.",
result);
}
ANGLE_TRY(mRenderer->allocateResource(queryDesc, &mActiveQuery->query));
// If we are doing time elapsed we also need a query to actually query the timestamp
if (queryType == GL_TIME_ELAPSED_EXT)
......@@ -181,31 +170,22 @@ gl::Error Query11::resume()
D3D11_QUERY_DESC desc;
desc.Query = D3D11_QUERY_TIMESTAMP;
desc.MiscFlags = 0;
result = device->CreateQuery(&desc, &mActiveQuery->beginTimestamp);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.",
result);
}
result = device->CreateQuery(&desc, &mActiveQuery->endTimestamp);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.",
result);
}
ANGLE_TRY(mRenderer->allocateResource(desc, &mActiveQuery->beginTimestamp));
ANGLE_TRY(mRenderer->allocateResource(desc, &mActiveQuery->endTimestamp));
}
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
if (d3dQueryType != D3D11_QUERY_EVENT)
{
context->Begin(mActiveQuery->query);
context->Begin(mActiveQuery->query.get());
}
// If we are doing time elapsed, query the begin timestamp
if (queryType == GL_TIME_ELAPSED_EXT)
{
context->End(mActiveQuery->beginTimestamp);
context->End(mActiveQuery->beginTimestamp.get());
}
}
......@@ -244,10 +224,10 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_ANY_SAMPLES_PASSED_EXT:
case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
{
ASSERT(queryState->query);
ASSERT(queryState->query.valid());
UINT64 numPixels = 0;
HRESULT result =
context->GetData(queryState->query, &numPixels, sizeof(numPixels), 0);
context->GetData(queryState->query.get(), &numPixels, sizeof(numPixels), 0);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
......@@ -265,9 +245,10 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
{
ASSERT(queryState->query);
ASSERT(queryState->query.valid());
D3D11_QUERY_DATA_SO_STATISTICS soStats = {0};
HRESULT result = context->GetData(queryState->query, &soStats, sizeof(soStats), 0);
HRESULT result =
context->GetData(queryState->query.get(), &soStats, sizeof(soStats), 0);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
......@@ -285,12 +266,12 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_TIME_ELAPSED_EXT:
{
ASSERT(queryState->query);
ASSERT(queryState->beginTimestamp);
ASSERT(queryState->endTimestamp);
ASSERT(queryState->query.valid());
ASSERT(queryState->beginTimestamp.valid());
ASSERT(queryState->endTimestamp.valid());
D3D11_QUERY_DATA_TIMESTAMP_DISJOINT timeStats = {0};
HRESULT result =
context->GetData(queryState->query, &timeStats, sizeof(timeStats), 0);
context->GetData(queryState->query.get(), &timeStats, sizeof(timeStats), 0);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
......@@ -301,8 +282,8 @@ gl::Error Query11::testQuery(QueryState *queryState)
if (result == S_OK)
{
UINT64 beginTime = 0;
HRESULT beginRes =
context->GetData(queryState->beginTimestamp, &beginTime, sizeof(UINT64), 0);
HRESULT beginRes = context->GetData(queryState->beginTimestamp.get(),
&beginTime, sizeof(UINT64), 0);
if (FAILED(beginRes))
{
return gl::Error(
......@@ -310,8 +291,8 @@ gl::Error Query11::testQuery(QueryState *queryState)
"Failed to get the data of an internal query, result: 0x%X.", beginRes);
}
UINT64 endTime = 0;
HRESULT endRes =
context->GetData(queryState->endTimestamp, &endTime, sizeof(UINT64), 0);
HRESULT endRes = context->GetData(queryState->endTimestamp.get(), &endTime,
sizeof(UINT64), 0);
if (FAILED(endRes))
{
return gl::Error(
......@@ -354,7 +335,7 @@ gl::Error Query11::testQuery(QueryState *queryState)
// D3D11 doesn't support GL timestamp queries as D3D timestamps are not guaranteed
// to have any sort of continuity outside of a disjoint timestamp query block, which
// GL depends on
ASSERT(queryState->query == nullptr);
ASSERT(!queryState->query.valid());
mResult = 0;
queryState->finished = true;
}
......@@ -362,10 +343,10 @@ gl::Error Query11::testQuery(QueryState *queryState)
case GL_COMMANDS_COMPLETED_CHROMIUM:
{
ASSERT(queryState->query);
ASSERT(queryState->query.valid());
BOOL completed = 0;
HRESULT result =
context->GetData(queryState->query, &completed, sizeof(completed), 0);
context->GetData(queryState->query.get(), &completed, sizeof(completed), 0);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
......
......@@ -12,6 +12,7 @@
#include <deque>
#include "libANGLE/renderer/QueryImpl.h"
#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
......@@ -41,9 +42,9 @@ class Query11 : public QueryImpl
QueryState();
~QueryState();
ID3D11Query *query;
ID3D11Query *beginTimestamp;
ID3D11Query *endTimestamp;
d3d11::Query query;
d3d11::Query beginTimestamp;
d3d11::Query endTimestamp;
bool finished;
};
......
......@@ -404,8 +404,6 @@ Renderer11::Renderer11(egl::Display *display)
mTrim = nullptr;
mSyncQuery = nullptr;
mRenderer11DeviceCaps.supportsClearView = false;
mRenderer11DeviceCaps.supportsConstantBufferOffsets = false;
mRenderer11DeviceCaps.supportsDXGI1_2 = false;
......@@ -1160,25 +1158,18 @@ gl::Error Renderer11::flush()
gl::Error Renderer11::finish()
{
HRESULT result;
if (!mSyncQuery)
if (!mSyncQuery.valid())
{
D3D11_QUERY_DESC queryDesc;
queryDesc.Query = D3D11_QUERY_EVENT;
queryDesc.MiscFlags = 0;
result = mDevice->CreateQuery(&queryDesc, &mSyncQuery);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create event query, result: 0x%X.",
result);
}
ANGLE_TRY(allocateResource(queryDesc, &mSyncQuery));
}
mDeviceContext->End(mSyncQuery);
mDeviceContext->End(mSyncQuery.get());
HRESULT result = S_OK;
unsigned int attempt = 0;
do
{
......@@ -1186,7 +1177,7 @@ gl::Error Renderer11::finish()
UINT flags = (attempt % flushFrequency == 0) ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH;
attempt++;
result = mDeviceContext->GetData(mSyncQuery, nullptr, 0, flags);
result = mDeviceContext->GetData(mSyncQuery.get(), nullptr, 0, flags);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.",
......@@ -2877,7 +2868,7 @@ void Renderer11::releaseDeviceResources()
mDriverConstantBufferVS.reset();
mDriverConstantBufferPS.reset();
mDriverConstantBufferCS.reset();
SafeRelease(mSyncQuery);
mSyncQuery.reset();
}
// set notify to true to broadcast a message to all contexts of the device loss
......
......@@ -658,7 +658,7 @@ class Renderer11 : public RendererD3D
Trim11 *mTrim;
// Sync query
ID3D11Query *mSyncQuery;
d3d11::Query mSyncQuery;
// Created objects state tracking
std::set<const Buffer11 *> mAliveBuffers;
......
......@@ -163,6 +163,14 @@ HRESULT CreateResource(ID3D11Device *device,
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_QUERY_DESC *desc,
void * /*initData*/,
ID3D11Query **resourceOut)
{
return device->CreateQuery(desc, resourceOut);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_RASTERIZER_DESC *desc,
void * /*initData*/,
ID3D11RasterizerState **rasterizerState)
......
......@@ -40,6 +40,7 @@ using ShaderData = WrappedArray<uint8_t>;
const std::vector<D3D11_SO_DECLARATION_ENTRY>) \
OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \
OP(NAME, PixelShader, ID3D11PixelShader, ShaderData, void) \
OP(NAME, Query, ID3D11Query, D3D11_QUERY_DESC, void) \
OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \
OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
ID3D11Resource) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment