blob: 4449118797f91a9d963abd7226a6e3d17dff17c6 [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
2// Copyright 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// ContextVk.cpp:
7// Implements the class methods for ContextVk.
8//
9
10#include "libANGLE/renderer/vulkan/ContextVk.h"
11
Jamie Madill20e005b2017-04-07 14:19:22 -040012#include "common/bitset_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040013#include "common/debug.h"
Frank Henigmana53d0e12018-02-13 00:06:06 -050014#include "common/utilities.h"
Jamie Madillbd159f02017-10-09 19:39:06 -040015#include "libANGLE/Context.h"
Jamie Madilldf68a6f2017-01-13 17:29:53 -050016#include "libANGLE/Program.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040017#include "libANGLE/renderer/vulkan/BufferVk.h"
Jamie Madill1f46bc12018-02-20 16:09:43 -050018#include "libANGLE/renderer/vulkan/CommandGraph.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040019#include "libANGLE/renderer/vulkan/CompilerVk.h"
20#include "libANGLE/renderer/vulkan/ContextVk.h"
21#include "libANGLE/renderer/vulkan/DeviceVk.h"
22#include "libANGLE/renderer/vulkan/FenceNVVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040023#include "libANGLE/renderer/vulkan/FramebufferVk.h"
24#include "libANGLE/renderer/vulkan/ImageVk.h"
Yunchao Hea336b902017-08-02 16:05:21 +080025#include "libANGLE/renderer/vulkan/ProgramPipelineVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040026#include "libANGLE/renderer/vulkan/ProgramVk.h"
27#include "libANGLE/renderer/vulkan/QueryVk.h"
28#include "libANGLE/renderer/vulkan/RenderbufferVk.h"
29#include "libANGLE/renderer/vulkan/RendererVk.h"
30#include "libANGLE/renderer/vulkan/SamplerVk.h"
31#include "libANGLE/renderer/vulkan/ShaderVk.h"
Jamie Madill70b5bb02017-08-28 13:32:37 -040032#include "libANGLE/renderer/vulkan/SyncVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040033#include "libANGLE/renderer/vulkan/TextureVk.h"
34#include "libANGLE/renderer/vulkan/TransformFeedbackVk.h"
35#include "libANGLE/renderer/vulkan/VertexArrayVk.h"
Jamie Madill3c424b42018-01-19 12:35:09 -050036#include "libANGLE/renderer/vulkan/vk_format_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040037
38namespace rx
39{
40
Jamie Madilld03a8492017-10-03 15:46:06 -040041namespace
42{
43
44VkIndexType GetVkIndexType(GLenum glIndexType)
45{
46 switch (glIndexType)
47 {
48 case GL_UNSIGNED_SHORT:
49 return VK_INDEX_TYPE_UINT16;
50 case GL_UNSIGNED_INT:
51 return VK_INDEX_TYPE_UINT32;
52 default:
53 UNREACHABLE();
54 return VK_INDEX_TYPE_MAX_ENUM;
55 }
56}
57
Jamie Madill76e471e2017-10-21 09:56:01 -040058enum DescriptorPoolIndex : uint8_t
59{
60 UniformBufferPool = 0,
61 TexturePool = 1,
62};
63
Frank Henigmana53d0e12018-02-13 00:06:06 -050064constexpr size_t kStreamingVertexDataSize = 1024 * 1024;
65constexpr size_t kStreamingIndexDataSize = 1024 * 8;
66
Jamie Madilld03a8492017-10-03 15:46:06 -040067} // anonymous namespace
68
Jamie Madillacccc6c2016-05-03 17:22:10 -040069ContextVk::ContextVk(const gl::ContextState &state, RendererVk *renderer)
Jamie Madill49ac74b2017-12-21 14:42:33 -050070 : ContextImpl(state),
71 mRenderer(renderer),
72 mCurrentDrawMode(GL_NONE),
73 mVertexArrayDirty(false),
Frank Henigman17448952017-01-05 15:48:26 -050074 mTexturesDirty(false),
Frank Henigmana53d0e12018-02-13 00:06:06 -050075 mStreamingVertexData(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, kStreamingVertexDataSize),
76 mStreamingIndexData(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, kStreamingIndexDataSize)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040077{
Jamie Madillf4d693c2018-02-14 16:38:16 -050078 memset(&mClearColorValue, 0, sizeof(mClearColorValue));
79 memset(&mClearDepthStencilValue, 0, sizeof(mClearDepthStencilValue));
Jamie Madill9e54b5a2016-05-25 12:57:39 -040080}
81
82ContextVk::~ContextVk()
83{
84}
85
Jamie Madill76e471e2017-10-21 09:56:01 -040086void ContextVk::onDestroy(const gl::Context *context)
87{
88 VkDevice device = mRenderer->getDevice();
89
90 mDescriptorPool.destroy(device);
Frank Henigman17448952017-01-05 15:48:26 -050091 mStreamingVertexData.destroy(device);
Frank Henigmana53d0e12018-02-13 00:06:06 -050092 mStreamingIndexData.destroy(device);
Luc Ferron360098d2018-02-21 07:33:50 -050093 mLineLoopHandler.destroy(device);
Jamie Madill76e471e2017-10-21 09:56:01 -040094}
95
Jamie Madill9e54b5a2016-05-25 12:57:39 -040096gl::Error ContextVk::initialize()
97{
Jamie Madill76e471e2017-10-21 09:56:01 -040098 VkDevice device = mRenderer->getDevice();
99
100 VkDescriptorPoolSize poolSizes[2];
101 poolSizes[UniformBufferPool].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
102 poolSizes[UniformBufferPool].descriptorCount = 1024;
103 poolSizes[TexturePool].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
104 poolSizes[TexturePool].descriptorCount = 1024;
105
106 VkDescriptorPoolCreateInfo descriptorPoolInfo;
107 descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
108 descriptorPoolInfo.pNext = nullptr;
109 descriptorPoolInfo.flags = 0;
110
111 // TODO(jmadill): Pick non-arbitrary max.
112 descriptorPoolInfo.maxSets = 2048;
113
114 // Reserve pools for uniform blocks and textures.
115 descriptorPoolInfo.poolSizeCount = 2;
116 descriptorPoolInfo.pPoolSizes = poolSizes;
117
118 ANGLE_TRY(mDescriptorPool.init(device, descriptorPoolInfo));
119
Jamie Madillf2f6d372018-01-10 21:37:23 -0500120 mPipelineDesc.reset(new vk::PipelineDesc());
121 mPipelineDesc->initDefaults();
122
Jamie Madille09bd5d2016-11-29 16:20:35 -0500123 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400124}
125
Jamie Madillafa02a22017-11-23 12:57:38 -0500126gl::Error ContextVk::flush(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400127{
Jamie Madill49ac74b2017-12-21 14:42:33 -0500128 // TODO(jmadill): Flush will need to insert a semaphore for the next flush to wait on.
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400129 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500130 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400131}
132
Jamie Madillafa02a22017-11-23 12:57:38 -0500133gl::Error ContextVk::finish(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400134{
Jamie Madill49ac74b2017-12-21 14:42:33 -0500135 return mRenderer->finish(context);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400136}
137
Jamie Madill4928b7c2017-06-20 12:57:39 -0400138gl::Error ContextVk::initPipeline(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400139{
Jamie Madillffa4cbb2018-01-23 13:04:07 -0500140 ASSERT(!mCurrentPipeline);
Jamie Madill72106562017-03-24 14:18:50 -0400141
Jamie Madillf2f6d372018-01-10 21:37:23 -0500142 const gl::State &state = mState.getState();
143 VertexArrayVk *vertexArrayVk = vk::GetImpl(state.getVertexArray());
144 FramebufferVk *framebufferVk = vk::GetImpl(state.getDrawFramebuffer());
145 ProgramVk *programVk = vk::GetImpl(state.getProgram());
Luc Ferronceb71902018-02-05 15:18:47 -0500146 const gl::AttributesMask activeAttribLocationsMask =
147 state.getProgram()->getActiveAttribLocationsMask();
Jamie Madillf2f6d372018-01-10 21:37:23 -0500148
149 // Ensure the topology of the pipeline description is updated.
150 mPipelineDesc->updateTopology(mCurrentDrawMode);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500151
Jamie Madill112a3a82018-01-23 13:04:06 -0500152 // Copy over the latest attrib and binding descriptions.
153 vertexArrayVk->getPackedInputDescriptions(mPipelineDesc.get());
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500154
Jamie Madillf2f6d372018-01-10 21:37:23 -0500155 // Ensure that the RenderPass description is updated.
156 mPipelineDesc->updateRenderPassDesc(framebufferVk->getRenderPassDesc(context));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500157
158 // TODO(jmadill): Validate with ASSERT against physical device limits/caps?
Luc Ferronceb71902018-02-05 15:18:47 -0500159 ANGLE_TRY(mRenderer->getPipeline(programVk, *mPipelineDesc, activeAttribLocationsMask,
160 &mCurrentPipeline));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500161
Jamie Madill72106562017-03-24 14:18:50 -0400162 return gl::NoError();
163}
164
Jamie Madill49ac74b2017-12-21 14:42:33 -0500165gl::Error ContextVk::setupDraw(const gl::Context *context,
166 GLenum mode,
167 DrawType drawType,
Frank Henigmana53d0e12018-02-13 00:06:06 -0500168 size_t firstVertex,
169 size_t lastVertex,
Luc Ferron78e39b32018-02-26 07:42:44 -0500170 ResourceVk *elementArrayBufferOverride,
Jamie Madill49ac74b2017-12-21 14:42:33 -0500171 vk::CommandBuffer **commandBuffer)
Jamie Madill72106562017-03-24 14:18:50 -0400172{
173 if (mode != mCurrentDrawMode)
174 {
175 invalidateCurrentPipeline();
176 mCurrentDrawMode = mode;
177 }
178
Jamie Madillffa4cbb2018-01-23 13:04:07 -0500179 if (!mCurrentPipeline)
Jamie Madill72106562017-03-24 14:18:50 -0400180 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400181 ANGLE_TRY(initPipeline(context));
Jamie Madill72106562017-03-24 14:18:50 -0400182 }
183
Frank Henigman17448952017-01-05 15:48:26 -0500184 const auto &state = mState.getState();
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500185 const gl::Program *programGL = state.getProgram();
Frank Henigman17448952017-01-05 15:48:26 -0500186 ProgramVk *programVk = vk::GetImpl(programGL);
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500187 const gl::VertexArray *vao = state.getVertexArray();
Frank Henigman17448952017-01-05 15:48:26 -0500188 VertexArrayVk *vkVAO = vk::GetImpl(vao);
189 const auto *drawFBO = state.getDrawFramebuffer();
190 FramebufferVk *vkFBO = vk::GetImpl(drawFBO);
Luc Ferronf8be7562018-02-06 15:59:11 -0500191 Serial queueSerial = mRenderer->getCurrentQueueSerial();
192 uint32_t maxAttrib = programGL->getState().getMaxActiveAttribLocation();
Jamie Madill72106562017-03-24 14:18:50 -0400193
Jamie Madille4c5a232018-03-02 21:00:31 -0500194 vk::CommandGraphNode *graphNode = nullptr;
195 ANGLE_TRY(vkFBO->getCommandGraphNodeForDraw(context, &graphNode));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500196
Jamie Madille4c5a232018-03-02 21:00:31 -0500197 if (!graphNode->getInsideRenderPassCommands()->valid())
Jamie Madill49ac74b2017-12-21 14:42:33 -0500198 {
199 mVertexArrayDirty = true;
200 mTexturesDirty = true;
Jamie Madille4c5a232018-03-02 21:00:31 -0500201 ANGLE_TRY(graphNode->beginInsideRenderPassRecording(mRenderer, commandBuffer));
Jamie Madill49ac74b2017-12-21 14:42:33 -0500202 }
203 else
204 {
Jamie Madille4c5a232018-03-02 21:00:31 -0500205 *commandBuffer = graphNode->getInsideRenderPassCommands();
Jamie Madill49ac74b2017-12-21 14:42:33 -0500206 }
Jamie Madillbd159f02017-10-09 19:39:06 -0400207
Jamie Madill49ac74b2017-12-21 14:42:33 -0500208 // Ensure any writes to the VAO buffers are flushed before we read from them.
Luc Ferron78e39b32018-02-26 07:42:44 -0500209 if (mVertexArrayDirty || elementArrayBufferOverride != nullptr)
Jamie Madill49ac74b2017-12-21 14:42:33 -0500210 {
Luc Ferron78e39b32018-02-26 07:42:44 -0500211
Jamie Madill49ac74b2017-12-21 14:42:33 -0500212 mVertexArrayDirty = false;
Jamie Madille4c5a232018-03-02 21:00:31 -0500213 vkVAO->updateDrawDependencies(graphNode, programGL->getActiveAttribLocationsMask(),
Luc Ferron78e39b32018-02-26 07:42:44 -0500214 elementArrayBufferOverride, queueSerial, drawType);
Jamie Madill49ac74b2017-12-21 14:42:33 -0500215 }
216
217 // Ensure any writes to the textures are flushed before we read from them.
218 if (mTexturesDirty)
219 {
220 mTexturesDirty = false;
221 // TODO(jmadill): Should probably merge this for loop with programVk's descriptor update.
222 const auto &completeTextures = state.getCompleteTextureCache();
223 for (const gl::SamplerBinding &samplerBinding : programGL->getSamplerBindings())
224 {
225 ASSERT(!samplerBinding.unreferenced);
226
227 // TODO(jmadill): Sampler arrays
228 ASSERT(samplerBinding.boundTextureUnits.size() == 1);
229
230 GLuint textureUnit = samplerBinding.boundTextureUnits[0];
231 const gl::Texture *texture = completeTextures[textureUnit];
232
233 // TODO(jmadill): Incomplete textures handling.
234 ASSERT(texture);
235
236 TextureVk *textureVk = vk::GetImpl(texture);
Jamie Madille4c5a232018-03-02 21:00:31 -0500237 textureVk->onReadResource(graphNode, mRenderer->getCurrentQueueSerial());
Jamie Madill49ac74b2017-12-21 14:42:33 -0500238 }
239 }
240
Jamie Madillffa4cbb2018-01-23 13:04:07 -0500241 (*commandBuffer)->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, mCurrentPipeline->get());
Frank Henigman17448952017-01-05 15:48:26 -0500242 ContextVk *contextVk = vk::GetImpl(context);
243 ANGLE_TRY(vkVAO->streamVertexData(contextVk, &mStreamingVertexData, firstVertex, lastVertex));
Jamie Madill49ac74b2017-12-21 14:42:33 -0500244 (*commandBuffer)
Frank Henigman17448952017-01-05 15:48:26 -0500245 ->bindVertexBuffers(0, maxAttrib, vkVAO->getCurrentArrayBufferHandles().data(),
246 vkVAO->getCurrentArrayBufferOffsets().data());
Jamie Madill49ac74b2017-12-21 14:42:33 -0500247
248 // Update the queue serial for the pipeline object.
Jamie Madillffa4cbb2018-01-23 13:04:07 -0500249 ASSERT(mCurrentPipeline && mCurrentPipeline->valid());
250 mCurrentPipeline->updateSerial(queueSerial);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500251
Jamie Madill76e471e2017-10-21 09:56:01 -0400252 // TODO(jmadill): Can probably use more dirty bits here.
Jamie Madill49ac74b2017-12-21 14:42:33 -0500253 ANGLE_TRY(programVk->updateUniforms(this));
254 programVk->updateTexturesDescriptorSet(this);
Jamie Madill76e471e2017-10-21 09:56:01 -0400255
256 // Bind the graphics descriptor sets.
257 // TODO(jmadill): Handle multiple command buffers.
Jamie Madill5547b382017-10-23 18:16:01 -0400258 const auto &descriptorSets = programVk->getDescriptorSets();
Jamie Madill8c3988c2017-12-21 14:44:56 -0500259 const gl::RangeUI &usedRange = programVk->getUsedDescriptorSetRange();
260 if (!usedRange.empty())
Jamie Madill76e471e2017-10-21 09:56:01 -0400261 {
Jamie Madill8c3988c2017-12-21 14:44:56 -0500262 ASSERT(!descriptorSets.empty());
263 const vk::PipelineLayout &pipelineLayout = mRenderer->getGraphicsPipelineLayout();
Jamie Madill49ac74b2017-12-21 14:42:33 -0500264 (*commandBuffer)
Jamie Madill8c3988c2017-12-21 14:44:56 -0500265 ->bindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, usedRange.low(),
266 usedRange.length(), &descriptorSets[usedRange.low()], 0, nullptr);
Jamie Madill76e471e2017-10-21 09:56:01 -0400267 }
268
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500269 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400270}
271
Jamie Madilld03a8492017-10-03 15:46:06 -0400272gl::Error ContextVk::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
273{
Jamie Madill49ac74b2017-12-21 14:42:33 -0500274 vk::CommandBuffer *commandBuffer = nullptr;
Luc Ferron78e39b32018-02-26 07:42:44 -0500275 ANGLE_TRY(setupDraw(context, mode, DrawType::Arrays, first, first + count - 1, nullptr,
276 &commandBuffer));
Luc Ferron360098d2018-02-21 07:33:50 -0500277
278 if (mode == GL_LINE_LOOP)
279 {
Luc Ferron78e39b32018-02-26 07:42:44 -0500280 ANGLE_TRY(mLineLoopHandler.createIndexBuffer(this, first, count));
281 mLineLoopHandler.bindIndexBuffer(VK_INDEX_TYPE_UINT32, &commandBuffer);
282 ANGLE_TRY(mLineLoopHandler.draw(count, commandBuffer));
Luc Ferron360098d2018-02-21 07:33:50 -0500283 }
284 else
285 {
286 commandBuffer->draw(count, 1, first, 0);
287 }
288
Jamie Madilld03a8492017-10-03 15:46:06 -0400289 return gl::NoError();
290}
291
Jamie Madillc564c072017-06-01 12:45:42 -0400292gl::Error ContextVk::drawArraysInstanced(const gl::Context *context,
293 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400294 GLint first,
295 GLsizei count,
296 GLsizei instanceCount)
297{
298 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500299 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400300}
301
Jamie Madillc564c072017-06-01 12:45:42 -0400302gl::Error ContextVk::drawElements(const gl::Context *context,
303 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400304 GLsizei count,
305 GLenum type,
Qin Jiajia1da00652017-06-20 17:16:25 +0800306 const void *indices)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400307{
Frank Henigmana53d0e12018-02-13 00:06:06 -0500308 gl::VertexArray *vao = mState.getState().getVertexArray();
309 const gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
Luc Ferron78e39b32018-02-26 07:42:44 -0500310 vk::CommandBuffer *commandBuffer = nullptr;
Jamie Madilld03a8492017-10-03 15:46:06 -0400311
Luc Ferron78e39b32018-02-26 07:42:44 -0500312 if (mode == GL_LINE_LOOP)
313 {
Frank Henigmana53d0e12018-02-13 00:06:06 -0500314 if (!elementArrayBuffer)
315 {
316 UNIMPLEMENTED();
317 return gl::InternalError() << "Line loop indices in client memory not supported";
318 }
319
320 BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer);
321
Luc Ferron78e39b32018-02-26 07:42:44 -0500322 ANGLE_TRY(mLineLoopHandler.createIndexBufferFromElementArrayBuffer(
323 this, elementArrayBufferVk, GetVkIndexType(type), count));
324
325 // TODO(fjhenigman): calculate the index range and pass to setupDraw()
326 ANGLE_TRY(setupDraw(context, mode, DrawType::Elements, 0, 0,
327 mLineLoopHandler.getLineLoopBufferResource(), &commandBuffer));
328
329 mLineLoopHandler.bindIndexBuffer(GetVkIndexType(type), &commandBuffer);
330 commandBuffer->drawIndexed(count + 1, 1, 0, 0, 0);
331 }
332 else
333 {
Luc Ferron78e39b32018-02-26 07:42:44 -0500334 if (type == GL_UNSIGNED_BYTE)
335 {
Frank Henigmana53d0e12018-02-13 00:06:06 -0500336 // TODO(fjhenigman): Index format translation.
Luc Ferron78e39b32018-02-26 07:42:44 -0500337 UNIMPLEMENTED();
338 return gl::InternalError() << "Unsigned byte translation is not yet implemented.";
339 }
340
Frank Henigmana53d0e12018-02-13 00:06:06 -0500341 ContextVk *contextVk = vk::GetImpl(context);
342 const bool computeIndexRange = vk::GetImpl(vao)->attribsToStream(contextVk).any();
343 gl::IndexRange range;
344 VkBuffer buffer = VK_NULL_HANDLE;
345 VkDeviceSize offset = 0;
346
347 if (elementArrayBuffer)
348 {
349 BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer);
350 buffer = elementArrayBufferVk->getVkBuffer().getHandle();
351 offset = 0;
352
353 if (computeIndexRange)
354 {
355 ANGLE_TRY(elementArrayBufferVk->getIndexRange(
356 context, type, 0, count, false /*primitiveRestartEnabled*/, &range));
357 }
358 }
359 else
360 {
361 const GLsizei amount = sizeof(GLushort) * count;
362 uint8_t *dst = nullptr;
363
364 ANGLE_TRY(mStreamingIndexData.allocate(contextVk, amount, &dst, &buffer, &offset));
365 memcpy(dst, indices, amount);
366 ANGLE_TRY(mStreamingIndexData.flush(contextVk));
367
368 if (computeIndexRange)
369 {
370 range =
371 gl::ComputeIndexRange(type, indices, count, false /*primitiveRestartEnabled*/);
372 }
373 }
374
375 ANGLE_TRY(setupDraw(context, mode, DrawType::Elements, range.start, range.end, nullptr,
376 &commandBuffer));
377 commandBuffer->bindIndexBuffer(buffer, offset, GetVkIndexType(type));
Luc Ferron78e39b32018-02-26 07:42:44 -0500378 commandBuffer->drawIndexed(count, 1, 0, 0, 0);
379 }
Jamie Madilld03a8492017-10-03 15:46:06 -0400380
381 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400382}
383
Jamie Madillc564c072017-06-01 12:45:42 -0400384gl::Error ContextVk::drawElementsInstanced(const gl::Context *context,
385 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400386 GLsizei count,
387 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400388 const void *indices,
Qin Jiajia1da00652017-06-20 17:16:25 +0800389 GLsizei instances)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400390{
391 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500392 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400393}
394
Jamie Madillc564c072017-06-01 12:45:42 -0400395gl::Error ContextVk::drawRangeElements(const gl::Context *context,
396 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400397 GLuint start,
398 GLuint end,
399 GLsizei count,
400 GLenum type,
Qin Jiajia1da00652017-06-20 17:16:25 +0800401 const void *indices)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400402{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500403 return gl::NoError();
404}
405
406VkDevice ContextVk::getDevice() const
407{
408 return mRenderer->getDevice();
409}
410
Jamie Madillc564c072017-06-01 12:45:42 -0400411gl::Error ContextVk::drawArraysIndirect(const gl::Context *context,
412 GLenum mode,
413 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800414{
415 UNIMPLEMENTED();
416 return gl::InternalError() << "DrawArraysIndirect hasn't been implemented for vulkan backend.";
417}
418
Jamie Madillc564c072017-06-01 12:45:42 -0400419gl::Error ContextVk::drawElementsIndirect(const gl::Context *context,
420 GLenum mode,
421 GLenum type,
422 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800423{
424 UNIMPLEMENTED();
425 return gl::InternalError()
426 << "DrawElementsIndirect hasn't been implemented for vulkan backend.";
427}
428
Corentin Wallez87fbe1c2016-08-03 14:41:42 -0400429GLenum ContextVk::getResetStatus()
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400430{
431 UNIMPLEMENTED();
Corentin Wallez87fbe1c2016-08-03 14:41:42 -0400432 return GL_NO_ERROR;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400433}
434
435std::string ContextVk::getVendorString() const
436{
437 UNIMPLEMENTED();
438 return std::string();
439}
440
441std::string ContextVk::getRendererDescription() const
442{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500443 return mRenderer->getRendererDescription();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400444}
445
446void ContextVk::insertEventMarker(GLsizei length, const char *marker)
447{
448 UNIMPLEMENTED();
449}
450
451void ContextVk::pushGroupMarker(GLsizei length, const char *marker)
452{
453 UNIMPLEMENTED();
454}
455
456void ContextVk::popGroupMarker()
457{
458 UNIMPLEMENTED();
459}
460
Geoff Lang5d5253a2017-11-22 14:51:12 -0500461void ContextVk::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message)
462{
463 UNIMPLEMENTED();
464}
465
466void ContextVk::popDebugGroup()
467{
468 UNIMPLEMENTED();
469}
470
Jamie Madillfe548342017-06-19 11:13:24 -0400471void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400472{
Jamie Madill72106562017-03-24 14:18:50 -0400473 if (dirtyBits.any())
474 {
475 invalidateCurrentPipeline();
476 }
Jamie Madillebf72992017-10-13 14:09:45 -0400477
478 const auto &glState = context->getGLState();
479
480 // TODO(jmadill): Full dirty bits implementation.
Jamie Madill5547b382017-10-23 18:16:01 -0400481 bool dirtyTextures = false;
Jamie Madillebf72992017-10-13 14:09:45 -0400482
483 for (auto dirtyBit : dirtyBits)
484 {
485 switch (dirtyBit)
486 {
487 case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
Luc Ferron00155d52018-02-06 10:48:47 -0500488 if (glState.isScissorTestEnabled())
489 {
490 mPipelineDesc->updateScissor(glState.getScissor());
491 }
492 else
493 {
494 mPipelineDesc->updateScissor(glState.getViewport());
495 }
Jamie Madillebf72992017-10-13 14:09:45 -0400496 break;
497 case gl::State::DIRTY_BIT_SCISSOR:
Luc Ferron00155d52018-02-06 10:48:47 -0500498 // Only modify the scissor region if the test is enabled, otherwise we want to keep
499 // the viewport size as the scissor region.
500 if (glState.isScissorTestEnabled())
501 {
502 mPipelineDesc->updateScissor(glState.getScissor());
503 }
Jamie Madillebf72992017-10-13 14:09:45 -0400504 break;
505 case gl::State::DIRTY_BIT_VIEWPORT:
Jamie Madillf2f6d372018-01-10 21:37:23 -0500506 mPipelineDesc->updateViewport(glState.getViewport(), glState.getNearPlane(),
507 glState.getFarPlane());
Luc Ferron00155d52018-02-06 10:48:47 -0500508
509 // If the scissor test isn't enabled, we have to also update the scissor to
510 // be equal to the viewport to make sure we keep rendering everything in the
511 // viewport.
512 if (!glState.isScissorTestEnabled())
513 {
514 mPipelineDesc->updateScissor(glState.getViewport());
515 }
Jamie Madillebf72992017-10-13 14:09:45 -0400516 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400517 case gl::State::DIRTY_BIT_DEPTH_RANGE:
518 WARN() << "DIRTY_BIT_DEPTH_RANGE unimplemented";
519 break;
520 case gl::State::DIRTY_BIT_BLEND_ENABLED:
Luc Ferronf8be7562018-02-06 15:59:11 -0500521 mPipelineDesc->updateBlendEnabled(glState.isBlendEnabled());
Jamie Madillebf72992017-10-13 14:09:45 -0400522 break;
523 case gl::State::DIRTY_BIT_BLEND_COLOR:
Luc Ferronf8be7562018-02-06 15:59:11 -0500524 mPipelineDesc->updateBlendColor(glState.getBlendColor());
Jamie Madillebf72992017-10-13 14:09:45 -0400525 break;
526 case gl::State::DIRTY_BIT_BLEND_FUNCS:
Luc Ferronf8be7562018-02-06 15:59:11 -0500527 mPipelineDesc->updateBlendFuncs(glState.getBlendState());
Jamie Madillebf72992017-10-13 14:09:45 -0400528 break;
529 case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
Luc Ferronf8be7562018-02-06 15:59:11 -0500530 mPipelineDesc->updateBlendEquations(glState.getBlendState());
Jamie Madillebf72992017-10-13 14:09:45 -0400531 break;
532 case gl::State::DIRTY_BIT_COLOR_MASK:
533 WARN() << "DIRTY_BIT_COLOR_MASK unimplemented";
534 break;
535 case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
536 WARN() << "DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED unimplemented";
537 break;
538 case gl::State::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED:
539 WARN() << "DIRTY_BIT_SAMPLE_COVERAGE_ENABLED unimplemented";
540 break;
541 case gl::State::DIRTY_BIT_SAMPLE_COVERAGE:
542 WARN() << "DIRTY_BIT_SAMPLE_COVERAGE unimplemented";
543 break;
544 case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED:
545 WARN() << "DIRTY_BIT_SAMPLE_MASK_ENABLED unimplemented";
546 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400547 case gl::State::DIRTY_BIT_SAMPLE_MASK:
548 WARN() << "DIRTY_BIT_SAMPLE_MASK unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400549 break;
550 case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
551 WARN() << "DIRTY_BIT_DEPTH_TEST_ENABLED unimplemented";
552 break;
553 case gl::State::DIRTY_BIT_DEPTH_FUNC:
554 WARN() << "DIRTY_BIT_DEPTH_FUNC unimplemented";
555 break;
556 case gl::State::DIRTY_BIT_DEPTH_MASK:
557 WARN() << "DIRTY_BIT_DEPTH_MASK unimplemented";
558 break;
559 case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
560 WARN() << "DIRTY_BIT_STENCIL_TEST_ENABLED unimplemented";
561 break;
562 case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
563 WARN() << "DIRTY_BIT_STENCIL_FUNCS_FRONT unimplemented";
564 break;
565 case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
566 WARN() << "DIRTY_BIT_STENCIL_FUNCS_BACK unimplemented";
567 break;
568 case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
569 WARN() << "DIRTY_BIT_STENCIL_OPS_FRONT unimplemented";
570 break;
571 case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
572 WARN() << "DIRTY_BIT_STENCIL_OPS_BACK unimplemented";
573 break;
574 case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
575 WARN() << "DIRTY_BIT_STENCIL_WRITEMASK_FRONT unimplemented";
576 break;
577 case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
578 WARN() << "DIRTY_BIT_STENCIL_WRITEMASK_BACK unimplemented";
579 break;
580 case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
581 case gl::State::DIRTY_BIT_CULL_FACE:
Jamie Madillf2f6d372018-01-10 21:37:23 -0500582 mPipelineDesc->updateCullMode(glState.getRasterizerState());
Jamie Madillebf72992017-10-13 14:09:45 -0400583 break;
584 case gl::State::DIRTY_BIT_FRONT_FACE:
Jamie Madillf2f6d372018-01-10 21:37:23 -0500585 mPipelineDesc->updateFrontFace(glState.getRasterizerState());
Jamie Madillebf72992017-10-13 14:09:45 -0400586 break;
587 case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
588 WARN() << "DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED unimplemented";
589 break;
590 case gl::State::DIRTY_BIT_POLYGON_OFFSET:
591 WARN() << "DIRTY_BIT_POLYGON_OFFSET unimplemented";
592 break;
593 case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
594 WARN() << "DIRTY_BIT_RASTERIZER_DISCARD_ENABLED unimplemented";
595 break;
596 case gl::State::DIRTY_BIT_LINE_WIDTH:
Jamie Madillf2f6d372018-01-10 21:37:23 -0500597 mPipelineDesc->updateLineWidth(glState.getLineWidth());
Jamie Madillebf72992017-10-13 14:09:45 -0400598 break;
599 case gl::State::DIRTY_BIT_PRIMITIVE_RESTART_ENABLED:
600 WARN() << "DIRTY_BIT_PRIMITIVE_RESTART_ENABLED unimplemented";
601 break;
602 case gl::State::DIRTY_BIT_CLEAR_COLOR:
Jamie Madillf4d693c2018-02-14 16:38:16 -0500603 mClearColorValue.color.float32[0] = glState.getColorClearValue().red;
604 mClearColorValue.color.float32[1] = glState.getColorClearValue().green;
605 mClearColorValue.color.float32[2] = glState.getColorClearValue().blue;
606 mClearColorValue.color.float32[3] = glState.getColorClearValue().alpha;
Jamie Madillebf72992017-10-13 14:09:45 -0400607 break;
608 case gl::State::DIRTY_BIT_CLEAR_DEPTH:
Jamie Madillf4d693c2018-02-14 16:38:16 -0500609 mClearDepthStencilValue.depthStencil.depth = glState.getDepthClearValue();
Jamie Madillebf72992017-10-13 14:09:45 -0400610 break;
611 case gl::State::DIRTY_BIT_CLEAR_STENCIL:
Jamie Madillf4d693c2018-02-14 16:38:16 -0500612 mClearDepthStencilValue.depthStencil.stencil =
613 static_cast<uint32_t>(glState.getStencilClearValue());
Jamie Madillebf72992017-10-13 14:09:45 -0400614 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400615 case gl::State::DIRTY_BIT_UNPACK_STATE:
616 WARN() << "DIRTY_BIT_UNPACK_STATE unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400617 break;
Corentin Wallez29a20992017-11-06 18:23:16 -0500618 case gl::State::DIRTY_BIT_UNPACK_BUFFER_BINDING:
619 WARN() << "DIRTY_BIT_UNPACK_BUFFER_BINDING unimplemented";
620 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400621 case gl::State::DIRTY_BIT_PACK_STATE:
622 WARN() << "DIRTY_BIT_PACK_STATE unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400623 break;
Corentin Wallez29a20992017-11-06 18:23:16 -0500624 case gl::State::DIRTY_BIT_PACK_BUFFER_BINDING:
625 WARN() << "DIRTY_BIT_PACK_BUFFER_BINDING unimplemented";
626 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400627 case gl::State::DIRTY_BIT_DITHER_ENABLED:
628 WARN() << "DIRTY_BIT_DITHER_ENABLED unimplemented";
629 break;
630 case gl::State::DIRTY_BIT_GENERATE_MIPMAP_HINT:
631 WARN() << "DIRTY_BIT_GENERATE_MIPMAP_HINT unimplemented";
632 break;
633 case gl::State::DIRTY_BIT_SHADER_DERIVATIVE_HINT:
634 WARN() << "DIRTY_BIT_SHADER_DERIVATIVE_HINT unimplemented";
635 break;
636 case gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING:
637 WARN() << "DIRTY_BIT_READ_FRAMEBUFFER_BINDING unimplemented";
638 break;
639 case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
640 WARN() << "DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING unimplemented";
641 break;
642 case gl::State::DIRTY_BIT_RENDERBUFFER_BINDING:
643 WARN() << "DIRTY_BIT_RENDERBUFFER_BINDING unimplemented";
644 break;
645 case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
Jamie Madill49ac74b2017-12-21 14:42:33 -0500646 mVertexArrayDirty = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400647 break;
648 case gl::State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING:
649 WARN() << "DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING unimplemented";
650 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +0800651 case gl::State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING:
652 WARN() << "DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING unimplemented";
653 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400654 case gl::State::DIRTY_BIT_PROGRAM_BINDING:
655 WARN() << "DIRTY_BIT_PROGRAM_BINDING unimplemented";
656 break;
657 case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
658 {
Jamie Madillf2f6d372018-01-10 21:37:23 -0500659 ProgramVk *programVk = vk::GetImpl(glState.getProgram());
660 mPipelineDesc->updateShaders(programVk);
Jamie Madill5547b382017-10-23 18:16:01 -0400661 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400662 break;
663 }
664 case gl::State::DIRTY_BIT_TEXTURE_BINDINGS:
Jamie Madill5547b382017-10-23 18:16:01 -0400665 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400666 break;
667 case gl::State::DIRTY_BIT_SAMPLER_BINDINGS:
Jamie Madill5547b382017-10-23 18:16:01 -0400668 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400669 break;
Geoff Langded79232017-11-28 15:21:11 -0500670 case gl::State::DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING:
671 WARN() << "DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING unimplemented";
672 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +0800673 case gl::State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING:
674 WARN() << "DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING unimplemented";
675 break;
Jamie Madillf4141212017-12-12 15:08:07 -0500676 case gl::State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS:
677 WARN() << "DIRTY_BIT_UNIFORM_BUFFER_BINDINGS unimplemented";
678 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400679 case gl::State::DIRTY_BIT_MULTISAMPLING:
680 WARN() << "DIRTY_BIT_MULTISAMPLING unimplemented";
681 break;
682 case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_ONE:
683 WARN() << "DIRTY_BIT_SAMPLE_ALPHA_TO_ONE unimplemented";
684 break;
685 case gl::State::DIRTY_BIT_COVERAGE_MODULATION:
686 WARN() << "DIRTY_BIT_COVERAGE_MODULATION unimplemented";
687 break;
688 case gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_MV:
689 WARN() << "DIRTY_BIT_PATH_RENDERING_MATRIX_MV unimplemented";
690 break;
691 case gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ:
692 WARN() << "DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ unimplemented";
693 break;
694 case gl::State::DIRTY_BIT_PATH_RENDERING_STENCIL_STATE:
695 WARN() << "DIRTY_BIT_PATH_RENDERING_STENCIL_STATE unimplemented";
696 break;
697 case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
698 WARN() << "DIRTY_BIT_FRAMEBUFFER_SRGB unimplemented";
699 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400700 case gl::State::DIRTY_BIT_CURRENT_VALUES:
701 WARN() << "DIRTY_BIT_CURRENT_VALUES unimplemented";
702 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400703 default:
Jamie Madillc67323a2017-11-02 23:11:41 -0400704 UNREACHABLE();
Jamie Madillebf72992017-10-13 14:09:45 -0400705 break;
706 }
707 }
Jamie Madill5547b382017-10-23 18:16:01 -0400708
709 if (dirtyTextures)
710 {
Jamie Madille1f3ad42017-10-28 23:00:42 -0400711 ProgramVk *programVk = vk::GetImpl(glState.getProgram());
Jamie Madill5547b382017-10-23 18:16:01 -0400712 programVk->invalidateTextures();
Jamie Madill49ac74b2017-12-21 14:42:33 -0500713 mTexturesDirty = true;
Jamie Madill5547b382017-10-23 18:16:01 -0400714 }
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400715}
716
717GLint ContextVk::getGPUDisjoint()
718{
719 UNIMPLEMENTED();
720 return GLint();
721}
722
723GLint64 ContextVk::getTimestamp()
724{
725 UNIMPLEMENTED();
726 return GLint64();
727}
728
Jamie Madill4928b7c2017-06-20 12:57:39 -0400729void ContextVk::onMakeCurrent(const gl::Context * /*context*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400730{
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400731}
732
733const gl::Caps &ContextVk::getNativeCaps() const
734{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400735 return mRenderer->getNativeCaps();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400736}
737
738const gl::TextureCapsMap &ContextVk::getNativeTextureCaps() const
739{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400740 return mRenderer->getNativeTextureCaps();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400741}
742
743const gl::Extensions &ContextVk::getNativeExtensions() const
744{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400745 return mRenderer->getNativeExtensions();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400746}
747
748const gl::Limitations &ContextVk::getNativeLimitations() const
749{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400750 return mRenderer->getNativeLimitations();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400751}
752
753CompilerImpl *ContextVk::createCompiler()
754{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400755 return new CompilerVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400756}
757
Jamie Madillacccc6c2016-05-03 17:22:10 -0400758ShaderImpl *ContextVk::createShader(const gl::ShaderState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400759{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400760 return new ShaderVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400761}
762
Jamie Madillacccc6c2016-05-03 17:22:10 -0400763ProgramImpl *ContextVk::createProgram(const gl::ProgramState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400764{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400765 return new ProgramVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400766}
767
Jamie Madillacccc6c2016-05-03 17:22:10 -0400768FramebufferImpl *ContextVk::createFramebuffer(const gl::FramebufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400769{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500770 return FramebufferVk::CreateUserFBO(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400771}
772
773TextureImpl *ContextVk::createTexture(const gl::TextureState &state)
774{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400775 return new TextureVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400776}
777
Jamie Madille703c602018-02-20 10:21:48 -0500778RenderbufferImpl *ContextVk::createRenderbuffer(const gl::RenderbufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400779{
Jamie Madille703c602018-02-20 10:21:48 -0500780 return new RenderbufferVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400781}
782
Jamie Madill8f775602016-11-03 16:45:34 -0400783BufferImpl *ContextVk::createBuffer(const gl::BufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400784{
Jamie Madill8f775602016-11-03 16:45:34 -0400785 return new BufferVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400786}
787
Jamie Madillacccc6c2016-05-03 17:22:10 -0400788VertexArrayImpl *ContextVk::createVertexArray(const gl::VertexArrayState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400789{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400790 return new VertexArrayVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400791}
792
793QueryImpl *ContextVk::createQuery(GLenum type)
794{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400795 return new QueryVk(type);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400796}
797
798FenceNVImpl *ContextVk::createFenceNV()
799{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400800 return new FenceNVVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400801}
802
Jamie Madill70b5bb02017-08-28 13:32:37 -0400803SyncImpl *ContextVk::createSync()
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400804{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400805 return new SyncVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400806}
807
Geoff Lang73bd2182016-07-15 13:01:24 -0400808TransformFeedbackImpl *ContextVk::createTransformFeedback(const gl::TransformFeedbackState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400809{
Geoff Lang73bd2182016-07-15 13:01:24 -0400810 return new TransformFeedbackVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400811}
812
Jamie Madill06ef36b2017-09-09 23:32:46 -0400813SamplerImpl *ContextVk::createSampler(const gl::SamplerState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400814{
Jamie Madill06ef36b2017-09-09 23:32:46 -0400815 return new SamplerVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400816}
817
Yunchao Hea336b902017-08-02 16:05:21 +0800818ProgramPipelineImpl *ContextVk::createProgramPipeline(const gl::ProgramPipelineState &state)
819{
820 return new ProgramPipelineVk(state);
821}
822
Sami Väisänene45e53b2016-05-25 10:36:04 +0300823std::vector<PathImpl *> ContextVk::createPaths(GLsizei)
824{
825 return std::vector<PathImpl *>();
826}
827
Jamie Madill72106562017-03-24 14:18:50 -0400828void ContextVk::invalidateCurrentPipeline()
829{
Jamie Madillffa4cbb2018-01-23 13:04:07 -0500830 mCurrentPipeline = nullptr;
Jamie Madill72106562017-03-24 14:18:50 -0400831}
832
Jamie Madill49ac74b2017-12-21 14:42:33 -0500833void ContextVk::onVertexArrayChange()
834{
835 // TODO(jmadill): Does not handle dependent state changes.
836 mVertexArrayDirty = true;
837 invalidateCurrentPipeline();
838}
839
Jamie Madillfe548342017-06-19 11:13:24 -0400840gl::Error ContextVk::dispatchCompute(const gl::Context *context,
841 GLuint numGroupsX,
842 GLuint numGroupsY,
843 GLuint numGroupsZ)
Xinghua Cao2b396592017-03-29 15:36:04 +0800844{
845 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500846 return gl::InternalError();
Xinghua Cao2b396592017-03-29 15:36:04 +0800847}
848
Qin Jiajia62fcf622017-11-30 16:16:12 +0800849gl::Error ContextVk::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
850{
851 UNIMPLEMENTED();
852 return gl::InternalError();
853}
854
Xinghua Cao89c422a2017-11-29 18:24:20 +0800855gl::Error ContextVk::memoryBarrier(const gl::Context *context, GLbitfield barriers)
856{
857 UNIMPLEMENTED();
858 return gl::InternalError();
859}
860
861gl::Error ContextVk::memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers)
862{
863 UNIMPLEMENTED();
864 return gl::InternalError();
865}
866
Jamie Madill76e471e2017-10-21 09:56:01 -0400867vk::DescriptorPool *ContextVk::getDescriptorPool()
868{
869 return &mDescriptorPool;
870}
871
Jamie Madillf4d693c2018-02-14 16:38:16 -0500872const VkClearValue &ContextVk::getClearColorValue() const
873{
874 return mClearColorValue;
875}
876
877const VkClearValue &ContextVk::getClearDepthStencilValue() const
878{
879 return mClearDepthStencilValue;
880}
881
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400882} // namespace rx