blob: 14e76aa54e60b92e6d8fd6cd7a628a3cb88b6669 [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"
Jamie Madillbd159f02017-10-09 19:39:06 -040014#include "libANGLE/Context.h"
Jamie Madilldf68a6f2017-01-13 17:29:53 -050015#include "libANGLE/Program.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040016#include "libANGLE/renderer/vulkan/BufferVk.h"
Jamie Madill49ac74b2017-12-21 14:42:33 -050017#include "libANGLE/renderer/vulkan/CommandBufferNode.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040018#include "libANGLE/renderer/vulkan/CompilerVk.h"
19#include "libANGLE/renderer/vulkan/ContextVk.h"
20#include "libANGLE/renderer/vulkan/DeviceVk.h"
21#include "libANGLE/renderer/vulkan/FenceNVVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040022#include "libANGLE/renderer/vulkan/FramebufferVk.h"
23#include "libANGLE/renderer/vulkan/ImageVk.h"
Yunchao Hea336b902017-08-02 16:05:21 +080024#include "libANGLE/renderer/vulkan/ProgramPipelineVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040025#include "libANGLE/renderer/vulkan/ProgramVk.h"
26#include "libANGLE/renderer/vulkan/QueryVk.h"
27#include "libANGLE/renderer/vulkan/RenderbufferVk.h"
28#include "libANGLE/renderer/vulkan/RendererVk.h"
29#include "libANGLE/renderer/vulkan/SamplerVk.h"
30#include "libANGLE/renderer/vulkan/ShaderVk.h"
Jamie Madill70b5bb02017-08-28 13:32:37 -040031#include "libANGLE/renderer/vulkan/SyncVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040032#include "libANGLE/renderer/vulkan/TextureVk.h"
33#include "libANGLE/renderer/vulkan/TransformFeedbackVk.h"
34#include "libANGLE/renderer/vulkan/VertexArrayVk.h"
Jamie Madilldf68a6f2017-01-13 17:29:53 -050035#include "libANGLE/renderer/vulkan/formatutilsvk.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040036
37namespace rx
38{
39
Jamie Madilld03a8492017-10-03 15:46:06 -040040namespace
41{
42
43VkIndexType GetVkIndexType(GLenum glIndexType)
44{
45 switch (glIndexType)
46 {
47 case GL_UNSIGNED_SHORT:
48 return VK_INDEX_TYPE_UINT16;
49 case GL_UNSIGNED_INT:
50 return VK_INDEX_TYPE_UINT32;
51 default:
52 UNREACHABLE();
53 return VK_INDEX_TYPE_MAX_ENUM;
54 }
55}
56
Jamie Madill76e471e2017-10-21 09:56:01 -040057enum DescriptorPoolIndex : uint8_t
58{
59 UniformBufferPool = 0,
60 TexturePool = 1,
61};
62
Jamie Madilld03a8492017-10-03 15:46:06 -040063} // anonymous namespace
64
Jamie Madillacccc6c2016-05-03 17:22:10 -040065ContextVk::ContextVk(const gl::ContextState &state, RendererVk *renderer)
Jamie Madill49ac74b2017-12-21 14:42:33 -050066 : ContextImpl(state),
67 mRenderer(renderer),
68 mCurrentDrawMode(GL_NONE),
69 mVertexArrayDirty(false),
70 mTexturesDirty(false)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040071{
Jamie Madillebf72992017-10-13 14:09:45 -040072 // The module handle is filled out at draw time.
73 mCurrentShaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
74 mCurrentShaderStages[0].pNext = nullptr;
75 mCurrentShaderStages[0].flags = 0;
76 mCurrentShaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
77 mCurrentShaderStages[0].module = VK_NULL_HANDLE;
78 mCurrentShaderStages[0].pName = "main";
79 mCurrentShaderStages[0].pSpecializationInfo = nullptr;
80
81 mCurrentShaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
82 mCurrentShaderStages[1].pNext = nullptr;
83 mCurrentShaderStages[1].flags = 0;
84 mCurrentShaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
85 mCurrentShaderStages[1].module = VK_NULL_HANDLE;
86 mCurrentShaderStages[1].pName = "main";
87 mCurrentShaderStages[1].pSpecializationInfo = nullptr;
88
89 // The binding descriptions are filled in at draw time.
90 mCurrentVertexInputState.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
91 mCurrentVertexInputState.pNext = nullptr;
92 mCurrentVertexInputState.flags = 0;
93 mCurrentVertexInputState.vertexBindingDescriptionCount = 0;
94 mCurrentVertexInputState.pVertexBindingDescriptions = nullptr;
95 mCurrentVertexInputState.vertexAttributeDescriptionCount = 0;
96 mCurrentVertexInputState.pVertexAttributeDescriptions = nullptr;
97
98 // Primitive topology is filled in at draw time.
99 mCurrentInputAssemblyState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
100 mCurrentInputAssemblyState.pNext = nullptr;
101 mCurrentInputAssemblyState.flags = 0;
102 mCurrentInputAssemblyState.topology = gl_vk::GetPrimitiveTopology(mCurrentDrawMode);
103 mCurrentInputAssemblyState.primitiveRestartEnable = VK_FALSE;
104
105 // Set initial viewport and scissor state.
106 mCurrentViewportVk.x = 0.0f;
107 mCurrentViewportVk.y = 0.0f;
108 mCurrentViewportVk.width = 0.0f;
109 mCurrentViewportVk.height = 0.0f;
110 mCurrentViewportVk.minDepth = 0.0f;
111 mCurrentViewportVk.maxDepth = 1.0f;
112
113 mCurrentScissorVk.offset.x = 0;
114 mCurrentScissorVk.offset.y = 0;
115 mCurrentScissorVk.extent.width = 0u;
116 mCurrentScissorVk.extent.height = 0u;
117
118 mCurrentViewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
119 mCurrentViewportState.pNext = nullptr;
120 mCurrentViewportState.flags = 0;
121 mCurrentViewportState.viewportCount = 1;
122 mCurrentViewportState.pViewports = &mCurrentViewportVk;
123 mCurrentViewportState.scissorCount = 1;
124 mCurrentViewportState.pScissors = &mCurrentScissorVk;
125
126 // Set initial rasterizer state.
127 // TODO(jmadill): Extra rasterizer state features.
128 mCurrentRasterState.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
129 mCurrentRasterState.pNext = nullptr;
130 mCurrentRasterState.flags = 0;
131 mCurrentRasterState.depthClampEnable = VK_FALSE;
132 mCurrentRasterState.rasterizerDiscardEnable = VK_FALSE;
133 mCurrentRasterState.polygonMode = VK_POLYGON_MODE_FILL;
134 mCurrentRasterState.cullMode = VK_CULL_MODE_NONE;
135 mCurrentRasterState.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
136 mCurrentRasterState.depthBiasEnable = VK_FALSE;
137 mCurrentRasterState.depthBiasConstantFactor = 0.0f;
138 mCurrentRasterState.depthBiasClamp = 0.0f;
139 mCurrentRasterState.depthBiasSlopeFactor = 0.0f;
140 mCurrentRasterState.lineWidth = 1.0f;
141
142 // Initialize a dummy multisample state.
143 // TODO(jmadill): Multisample state.
144 mCurrentMultisampleState.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
145 mCurrentMultisampleState.pNext = nullptr;
146 mCurrentMultisampleState.flags = 0;
147 mCurrentMultisampleState.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
148 mCurrentMultisampleState.sampleShadingEnable = VK_FALSE;
149 mCurrentMultisampleState.minSampleShading = 0.0f;
150 mCurrentMultisampleState.pSampleMask = nullptr;
151 mCurrentMultisampleState.alphaToCoverageEnable = VK_FALSE;
152 mCurrentMultisampleState.alphaToOneEnable = VK_FALSE;
153
154 // TODO(jmadill): Depth/stencil state.
155
156 // Initialize a dummy MRT blend state.
157 // TODO(jmadill): Blend state/MRT.
158 mCurrentBlendAttachmentState.blendEnable = VK_FALSE;
159 mCurrentBlendAttachmentState.srcColorBlendFactor = VK_BLEND_FACTOR_ONE;
160 mCurrentBlendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ONE;
161 mCurrentBlendAttachmentState.colorBlendOp = VK_BLEND_OP_ADD;
162 mCurrentBlendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
163 mCurrentBlendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
164 mCurrentBlendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD;
165 mCurrentBlendAttachmentState.colorWriteMask =
166 (VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT |
167 VK_COLOR_COMPONENT_A_BIT);
168
169 mCurrentBlendState.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
170 mCurrentBlendState.pNext = 0;
171 mCurrentBlendState.flags = 0;
172 mCurrentBlendState.logicOpEnable = VK_FALSE;
173 mCurrentBlendState.logicOp = VK_LOGIC_OP_CLEAR;
174 mCurrentBlendState.attachmentCount = 1;
175 mCurrentBlendState.pAttachments = &mCurrentBlendAttachmentState;
176 mCurrentBlendState.blendConstants[0] = 0.0f;
177 mCurrentBlendState.blendConstants[1] = 0.0f;
178 mCurrentBlendState.blendConstants[2] = 0.0f;
179 mCurrentBlendState.blendConstants[3] = 0.0f;
180
181 // TODO(jmadill): Dynamic state.
182
183 // The layout and renderpass are filled out at draw time.
184 mCurrentPipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
185 mCurrentPipelineInfo.pNext = nullptr;
186 mCurrentPipelineInfo.flags = 0;
187 mCurrentPipelineInfo.stageCount = 2;
188 mCurrentPipelineInfo.pStages = mCurrentShaderStages;
189 mCurrentPipelineInfo.pVertexInputState = &mCurrentVertexInputState;
190 mCurrentPipelineInfo.pInputAssemblyState = &mCurrentInputAssemblyState;
191 mCurrentPipelineInfo.pTessellationState = nullptr;
192 mCurrentPipelineInfo.pViewportState = &mCurrentViewportState;
193 mCurrentPipelineInfo.pRasterizationState = &mCurrentRasterState;
194 mCurrentPipelineInfo.pMultisampleState = &mCurrentMultisampleState;
195 mCurrentPipelineInfo.pDepthStencilState = nullptr;
196 mCurrentPipelineInfo.pColorBlendState = &mCurrentBlendState;
197 mCurrentPipelineInfo.pDynamicState = nullptr;
198 mCurrentPipelineInfo.layout = VK_NULL_HANDLE;
199 mCurrentPipelineInfo.renderPass = VK_NULL_HANDLE;
200 mCurrentPipelineInfo.subpass = 0;
201 mCurrentPipelineInfo.basePipelineHandle = VK_NULL_HANDLE;
202 mCurrentPipelineInfo.basePipelineIndex = 0;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400203}
204
205ContextVk::~ContextVk()
206{
Jamie Madill72106562017-03-24 14:18:50 -0400207 invalidateCurrentPipeline();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400208}
209
Jamie Madill76e471e2017-10-21 09:56:01 -0400210void ContextVk::onDestroy(const gl::Context *context)
211{
212 VkDevice device = mRenderer->getDevice();
213
214 mDescriptorPool.destroy(device);
215}
216
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400217gl::Error ContextVk::initialize()
218{
Jamie Madill76e471e2017-10-21 09:56:01 -0400219 VkDevice device = mRenderer->getDevice();
220
221 VkDescriptorPoolSize poolSizes[2];
222 poolSizes[UniformBufferPool].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
223 poolSizes[UniformBufferPool].descriptorCount = 1024;
224 poolSizes[TexturePool].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
225 poolSizes[TexturePool].descriptorCount = 1024;
226
227 VkDescriptorPoolCreateInfo descriptorPoolInfo;
228 descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
229 descriptorPoolInfo.pNext = nullptr;
230 descriptorPoolInfo.flags = 0;
231
232 // TODO(jmadill): Pick non-arbitrary max.
233 descriptorPoolInfo.maxSets = 2048;
234
235 // Reserve pools for uniform blocks and textures.
236 descriptorPoolInfo.poolSizeCount = 2;
237 descriptorPoolInfo.pPoolSizes = poolSizes;
238
239 ANGLE_TRY(mDescriptorPool.init(device, descriptorPoolInfo));
240
Jamie Madille09bd5d2016-11-29 16:20:35 -0500241 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400242}
243
Jamie Madillafa02a22017-11-23 12:57:38 -0500244gl::Error ContextVk::flush(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400245{
Jamie Madill49ac74b2017-12-21 14:42:33 -0500246 // TODO(jmadill): Flush will need to insert a semaphore for the next flush to wait on.
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400247 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500248 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400249}
250
Jamie Madillafa02a22017-11-23 12:57:38 -0500251gl::Error ContextVk::finish(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400252{
Jamie Madill49ac74b2017-12-21 14:42:33 -0500253 return mRenderer->finish(context);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400254}
255
Jamie Madill4928b7c2017-06-20 12:57:39 -0400256gl::Error ContextVk::initPipeline(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400257{
Jamie Madill72106562017-03-24 14:18:50 -0400258 ASSERT(!mCurrentPipeline.valid());
259
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500260 VkDevice device = mRenderer->getDevice();
261 const auto &state = mState.getState();
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500262 const gl::VertexArray *vao = state.getVertexArray();
263 const gl::Framebuffer *drawFBO = state.getDrawFramebuffer();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400264 FramebufferVk *vkFBO = vk::GetImpl(drawFBO);
265 VertexArrayVk *vkVAO = vk::GetImpl(vao);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500266
Jamie Madillebf72992017-10-13 14:09:45 -0400267 // Ensure the attribs and bindings are updated.
268 vkVAO->updateVertexDescriptions(context);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500269
Jamie Madillebf72992017-10-13 14:09:45 -0400270 const auto &vertexBindings = vkVAO->getVertexBindingDescs();
271 const auto &vertexAttribs = vkVAO->getVertexAttribDescs();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500272
273 // TODO(jmadill): Validate with ASSERT against physical device limits/caps?
Jamie Madillebf72992017-10-13 14:09:45 -0400274 mCurrentVertexInputState.vertexBindingDescriptionCount =
275 static_cast<uint32_t>(vertexBindings.size());
276 mCurrentVertexInputState.pVertexBindingDescriptions = vertexBindings.data();
277 mCurrentVertexInputState.vertexAttributeDescriptionCount =
278 static_cast<uint32_t>(vertexAttribs.size());
279 mCurrentVertexInputState.pVertexAttributeDescriptions = vertexAttribs.data();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500280
Jamie Madillebf72992017-10-13 14:09:45 -0400281 mCurrentInputAssemblyState.topology = gl_vk::GetPrimitiveTopology(mCurrentDrawMode);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500282
Jamie Madill9f2a8612017-11-30 12:43:09 -0500283 const vk::RenderPassDesc &desc = vkFBO->getRenderPassDesc(context);
284
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500285 vk::RenderPass *renderPass = nullptr;
Jamie Madill9f2a8612017-11-30 12:43:09 -0500286 ANGLE_TRY(mRenderer->getCompatibleRenderPass(desc, &renderPass));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500287 ASSERT(renderPass && renderPass->valid());
288
Jamie Madill8c3988c2017-12-21 14:44:56 -0500289 const vk::PipelineLayout &pipelineLayout = mRenderer->getGraphicsPipelineLayout();
Jamie Madillc5143482017-10-15 20:20:06 -0400290 ASSERT(pipelineLayout.valid());
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500291
Jamie Madillc5143482017-10-15 20:20:06 -0400292 mCurrentPipelineInfo.layout = pipelineLayout.getHandle();
Jamie Madillebf72992017-10-13 14:09:45 -0400293 mCurrentPipelineInfo.renderPass = renderPass->getHandle();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500294
Jamie Madill25301b62017-10-28 20:59:31 -0400295 ANGLE_TRY(mCurrentPipeline.initGraphics(device, mCurrentPipelineInfo));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500296
Jamie Madill72106562017-03-24 14:18:50 -0400297 return gl::NoError();
298}
299
Jamie Madill49ac74b2017-12-21 14:42:33 -0500300gl::Error ContextVk::setupDraw(const gl::Context *context,
301 GLenum mode,
302 DrawType drawType,
303 vk::CommandBuffer **commandBuffer)
Jamie Madill72106562017-03-24 14:18:50 -0400304{
305 if (mode != mCurrentDrawMode)
306 {
307 invalidateCurrentPipeline();
308 mCurrentDrawMode = mode;
309 }
310
311 if (!mCurrentPipeline.valid())
312 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400313 ANGLE_TRY(initPipeline(context));
Jamie Madill72106562017-03-24 14:18:50 -0400314 ASSERT(mCurrentPipeline.valid());
315 }
316
Jamie Madill72106562017-03-24 14:18:50 -0400317 const auto &state = mState.getState();
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500318 const gl::Program *programGL = state.getProgram();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400319 ProgramVk *programVk = vk::GetImpl(programGL);
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500320 const gl::VertexArray *vao = state.getVertexArray();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400321 VertexArrayVk *vkVAO = vk::GetImpl(vao);
Jamie Madill72106562017-03-24 14:18:50 -0400322 const auto *drawFBO = state.getDrawFramebuffer();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400323 FramebufferVk *vkFBO = vk::GetImpl(drawFBO);
Jamie Madill72106562017-03-24 14:18:50 -0400324 Serial queueSerial = mRenderer->getCurrentQueueSerial();
Jamie Madillbd159f02017-10-09 19:39:06 -0400325 uint32_t maxAttrib = programGL->getState().getMaxActiveAttribLocation();
Jamie Madill72106562017-03-24 14:18:50 -0400326
Jamie Madillbd159f02017-10-09 19:39:06 -0400327 // Process vertex attributes. Assume zero offsets for now.
328 // TODO(jmadill): Offset handling.
Jamie Madillda854a22017-11-30 17:24:21 -0500329 const auto &vertexHandles = vkVAO->getCurrentArrayBufferHandles();
330 angle::MemoryBuffer *zeroBuf = nullptr;
Jamie Madillbd159f02017-10-09 19:39:06 -0400331 ANGLE_TRY(context->getZeroFilledBuffer(maxAttrib * sizeof(VkDeviceSize), &zeroBuf));
Jamie Madill72106562017-03-24 14:18:50 -0400332
Jamie Madill49ac74b2017-12-21 14:42:33 -0500333 // TODO(jmadill): Need to link up the TextureVk to the Secondary CB.
334 vk::CommandBufferNode *renderNode = nullptr;
335 ANGLE_TRY(vkFBO->getRenderNode(context, &renderNode));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500336
Jamie Madill49ac74b2017-12-21 14:42:33 -0500337 if (!renderNode->getInsideRenderPassCommands()->valid())
338 {
339 mVertexArrayDirty = true;
340 mTexturesDirty = true;
341 ANGLE_TRY(renderNode->startRenderPassRecording(mRenderer, commandBuffer));
342 }
343 else
344 {
345 *commandBuffer = renderNode->getInsideRenderPassCommands();
346 }
Jamie Madillbd159f02017-10-09 19:39:06 -0400347
Jamie Madill49ac74b2017-12-21 14:42:33 -0500348 // Ensure any writes to the VAO buffers are flushed before we read from them.
349 if (mVertexArrayDirty)
350 {
351 mVertexArrayDirty = false;
352 vkVAO->updateDrawDependencies(renderNode, programGL->getActiveAttribLocationsMask(),
353 queueSerial, drawType);
354 }
355
356 // Ensure any writes to the textures are flushed before we read from them.
357 if (mTexturesDirty)
358 {
359 mTexturesDirty = false;
360 // TODO(jmadill): Should probably merge this for loop with programVk's descriptor update.
361 const auto &completeTextures = state.getCompleteTextureCache();
362 for (const gl::SamplerBinding &samplerBinding : programGL->getSamplerBindings())
363 {
364 ASSERT(!samplerBinding.unreferenced);
365
366 // TODO(jmadill): Sampler arrays
367 ASSERT(samplerBinding.boundTextureUnits.size() == 1);
368
369 GLuint textureUnit = samplerBinding.boundTextureUnits[0];
370 const gl::Texture *texture = completeTextures[textureUnit];
371
372 // TODO(jmadill): Incomplete textures handling.
373 ASSERT(texture);
374
375 TextureVk *textureVk = vk::GetImpl(texture);
376 textureVk->updateDependencies(renderNode, mRenderer->getCurrentQueueSerial());
377 }
378 }
379
380 (*commandBuffer)->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, mCurrentPipeline);
381 (*commandBuffer)
382 ->bindVertexBuffers(0, maxAttrib, vertexHandles.data(),
383 reinterpret_cast<const VkDeviceSize *>(zeroBuf->data()));
384
385 // Update the queue serial for the pipeline object.
Jamie Madillabd31352017-09-19 00:24:58 -0400386 // TODO(jmadill): the queue serial should be bound to the pipeline.
Jamie Madill49ac74b2017-12-21 14:42:33 -0500387 updateQueueSerial(queueSerial);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500388
Jamie Madill76e471e2017-10-21 09:56:01 -0400389 // TODO(jmadill): Can probably use more dirty bits here.
Jamie Madill49ac74b2017-12-21 14:42:33 -0500390 ANGLE_TRY(programVk->updateUniforms(this));
391 programVk->updateTexturesDescriptorSet(this);
Jamie Madill76e471e2017-10-21 09:56:01 -0400392
393 // Bind the graphics descriptor sets.
394 // TODO(jmadill): Handle multiple command buffers.
Jamie Madill5547b382017-10-23 18:16:01 -0400395 const auto &descriptorSets = programVk->getDescriptorSets();
Jamie Madill8c3988c2017-12-21 14:44:56 -0500396 const gl::RangeUI &usedRange = programVk->getUsedDescriptorSetRange();
397 if (!usedRange.empty())
Jamie Madill76e471e2017-10-21 09:56:01 -0400398 {
Jamie Madill8c3988c2017-12-21 14:44:56 -0500399 ASSERT(!descriptorSets.empty());
400 const vk::PipelineLayout &pipelineLayout = mRenderer->getGraphicsPipelineLayout();
Jamie Madill49ac74b2017-12-21 14:42:33 -0500401 (*commandBuffer)
Jamie Madill8c3988c2017-12-21 14:44:56 -0500402 ->bindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, usedRange.low(),
403 usedRange.length(), &descriptorSets[usedRange.low()], 0, nullptr);
Jamie Madill76e471e2017-10-21 09:56:01 -0400404 }
405
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500406 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400407}
408
Jamie Madilld03a8492017-10-03 15:46:06 -0400409gl::Error ContextVk::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
410{
Jamie Madill49ac74b2017-12-21 14:42:33 -0500411 vk::CommandBuffer *commandBuffer = nullptr;
412 ANGLE_TRY(setupDraw(context, mode, DrawType::Arrays, &commandBuffer));
Jamie Madilld03a8492017-10-03 15:46:06 -0400413 commandBuffer->draw(count, 1, first, 0);
414 return gl::NoError();
415}
416
Jamie Madillc564c072017-06-01 12:45:42 -0400417gl::Error ContextVk::drawArraysInstanced(const gl::Context *context,
418 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400419 GLint first,
420 GLsizei count,
421 GLsizei instanceCount)
422{
423 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500424 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400425}
426
Jamie Madillc564c072017-06-01 12:45:42 -0400427gl::Error ContextVk::drawElements(const gl::Context *context,
428 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400429 GLsizei count,
430 GLenum type,
Qin Jiajia1da00652017-06-20 17:16:25 +0800431 const void *indices)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400432{
Jamie Madill49ac74b2017-12-21 14:42:33 -0500433 vk::CommandBuffer *commandBuffer;
434 ANGLE_TRY(setupDraw(context, mode, DrawType::Elements, &commandBuffer));
Jamie Madilld03a8492017-10-03 15:46:06 -0400435
436 if (indices)
437 {
438 // TODO(jmadill): Buffer offsets and immediate data.
439 UNIMPLEMENTED();
440 return gl::InternalError() << "Only zero-offset index buffers are currently implemented.";
441 }
442
443 if (type == GL_UNSIGNED_BYTE)
444 {
445 // TODO(jmadill): Index translation.
446 UNIMPLEMENTED();
447 return gl::InternalError() << "Unsigned byte translation is not yet implemented.";
448 }
449
Jamie Madilld03a8492017-10-03 15:46:06 -0400450 const gl::Buffer *elementArrayBuffer =
451 mState.getState().getVertexArray()->getElementArrayBuffer().get();
452 ASSERT(elementArrayBuffer);
453
Jamie Madille1f3ad42017-10-28 23:00:42 -0400454 BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer);
Jamie Madilld03a8492017-10-03 15:46:06 -0400455
456 commandBuffer->bindIndexBuffer(elementArrayBufferVk->getVkBuffer(), 0, GetVkIndexType(type));
457 commandBuffer->drawIndexed(count, 1, 0, 0, 0);
458
459 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400460}
461
Jamie Madillc564c072017-06-01 12:45:42 -0400462gl::Error ContextVk::drawElementsInstanced(const gl::Context *context,
463 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400464 GLsizei count,
465 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400466 const void *indices,
Qin Jiajia1da00652017-06-20 17:16:25 +0800467 GLsizei instances)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400468{
469 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500470 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400471}
472
Jamie Madillc564c072017-06-01 12:45:42 -0400473gl::Error ContextVk::drawRangeElements(const gl::Context *context,
474 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400475 GLuint start,
476 GLuint end,
477 GLsizei count,
478 GLenum type,
Qin Jiajia1da00652017-06-20 17:16:25 +0800479 const void *indices)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400480{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500481 return gl::NoError();
482}
483
484VkDevice ContextVk::getDevice() const
485{
486 return mRenderer->getDevice();
487}
488
Jamie Madillc564c072017-06-01 12:45:42 -0400489gl::Error ContextVk::drawArraysIndirect(const gl::Context *context,
490 GLenum mode,
491 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800492{
493 UNIMPLEMENTED();
494 return gl::InternalError() << "DrawArraysIndirect hasn't been implemented for vulkan backend.";
495}
496
Jamie Madillc564c072017-06-01 12:45:42 -0400497gl::Error ContextVk::drawElementsIndirect(const gl::Context *context,
498 GLenum mode,
499 GLenum type,
500 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800501{
502 UNIMPLEMENTED();
503 return gl::InternalError()
504 << "DrawElementsIndirect hasn't been implemented for vulkan backend.";
505}
506
Corentin Wallez87fbe1c2016-08-03 14:41:42 -0400507GLenum ContextVk::getResetStatus()
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400508{
509 UNIMPLEMENTED();
Corentin Wallez87fbe1c2016-08-03 14:41:42 -0400510 return GL_NO_ERROR;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400511}
512
513std::string ContextVk::getVendorString() const
514{
515 UNIMPLEMENTED();
516 return std::string();
517}
518
519std::string ContextVk::getRendererDescription() const
520{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500521 return mRenderer->getRendererDescription();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400522}
523
524void ContextVk::insertEventMarker(GLsizei length, const char *marker)
525{
526 UNIMPLEMENTED();
527}
528
529void ContextVk::pushGroupMarker(GLsizei length, const char *marker)
530{
531 UNIMPLEMENTED();
532}
533
534void ContextVk::popGroupMarker()
535{
536 UNIMPLEMENTED();
537}
538
Geoff Lang5d5253a2017-11-22 14:51:12 -0500539void ContextVk::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message)
540{
541 UNIMPLEMENTED();
542}
543
544void ContextVk::popDebugGroup()
545{
546 UNIMPLEMENTED();
547}
548
Jamie Madillfe548342017-06-19 11:13:24 -0400549void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400550{
Jamie Madill72106562017-03-24 14:18:50 -0400551 if (dirtyBits.any())
552 {
553 invalidateCurrentPipeline();
554 }
Jamie Madillebf72992017-10-13 14:09:45 -0400555
556 const auto &glState = context->getGLState();
557
558 // TODO(jmadill): Full dirty bits implementation.
Jamie Madill5547b382017-10-23 18:16:01 -0400559 bool dirtyTextures = false;
Jamie Madillebf72992017-10-13 14:09:45 -0400560
561 for (auto dirtyBit : dirtyBits)
562 {
563 switch (dirtyBit)
564 {
565 case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
566 WARN() << "DIRTY_BIT_SCISSOR_TEST_ENABLED unimplemented";
567 break;
568 case gl::State::DIRTY_BIT_SCISSOR:
569 WARN() << "DIRTY_BIT_SCISSOR unimplemented";
570 break;
571 case gl::State::DIRTY_BIT_VIEWPORT:
572 {
573 const gl::Rectangle &viewportGL = glState.getViewport();
574 mCurrentViewportVk.x = static_cast<float>(viewportGL.x);
575 mCurrentViewportVk.y = static_cast<float>(viewportGL.y);
576 mCurrentViewportVk.width = static_cast<float>(viewportGL.width);
577 mCurrentViewportVk.height = static_cast<float>(viewportGL.height);
578 mCurrentViewportVk.minDepth = glState.getNearPlane();
579 mCurrentViewportVk.maxDepth = glState.getFarPlane();
580
581 // TODO(jmadill): Scissor.
582 mCurrentScissorVk.offset.x = viewportGL.x;
583 mCurrentScissorVk.offset.y = viewportGL.y;
584 mCurrentScissorVk.extent.width = viewportGL.width;
585 mCurrentScissorVk.extent.height = viewportGL.height;
586 break;
587 }
588 case gl::State::DIRTY_BIT_DEPTH_RANGE:
589 WARN() << "DIRTY_BIT_DEPTH_RANGE unimplemented";
590 break;
591 case gl::State::DIRTY_BIT_BLEND_ENABLED:
592 WARN() << "DIRTY_BIT_BLEND_ENABLED unimplemented";
593 break;
594 case gl::State::DIRTY_BIT_BLEND_COLOR:
595 WARN() << "DIRTY_BIT_BLEND_COLOR unimplemented";
596 break;
597 case gl::State::DIRTY_BIT_BLEND_FUNCS:
598 WARN() << "DIRTY_BIT_BLEND_FUNCS unimplemented";
599 break;
600 case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
601 WARN() << "DIRTY_BIT_BLEND_EQUATIONS unimplemented";
602 break;
603 case gl::State::DIRTY_BIT_COLOR_MASK:
604 WARN() << "DIRTY_BIT_COLOR_MASK unimplemented";
605 break;
606 case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
607 WARN() << "DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED unimplemented";
608 break;
609 case gl::State::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED:
610 WARN() << "DIRTY_BIT_SAMPLE_COVERAGE_ENABLED unimplemented";
611 break;
612 case gl::State::DIRTY_BIT_SAMPLE_COVERAGE:
613 WARN() << "DIRTY_BIT_SAMPLE_COVERAGE unimplemented";
614 break;
615 case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED:
616 WARN() << "DIRTY_BIT_SAMPLE_MASK_ENABLED unimplemented";
617 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400618 case gl::State::DIRTY_BIT_SAMPLE_MASK:
619 WARN() << "DIRTY_BIT_SAMPLE_MASK unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400620 break;
621 case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
622 WARN() << "DIRTY_BIT_DEPTH_TEST_ENABLED unimplemented";
623 break;
624 case gl::State::DIRTY_BIT_DEPTH_FUNC:
625 WARN() << "DIRTY_BIT_DEPTH_FUNC unimplemented";
626 break;
627 case gl::State::DIRTY_BIT_DEPTH_MASK:
628 WARN() << "DIRTY_BIT_DEPTH_MASK unimplemented";
629 break;
630 case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
631 WARN() << "DIRTY_BIT_STENCIL_TEST_ENABLED unimplemented";
632 break;
633 case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
634 WARN() << "DIRTY_BIT_STENCIL_FUNCS_FRONT unimplemented";
635 break;
636 case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
637 WARN() << "DIRTY_BIT_STENCIL_FUNCS_BACK unimplemented";
638 break;
639 case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
640 WARN() << "DIRTY_BIT_STENCIL_OPS_FRONT unimplemented";
641 break;
642 case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
643 WARN() << "DIRTY_BIT_STENCIL_OPS_BACK unimplemented";
644 break;
645 case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
646 WARN() << "DIRTY_BIT_STENCIL_WRITEMASK_FRONT unimplemented";
647 break;
648 case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
649 WARN() << "DIRTY_BIT_STENCIL_WRITEMASK_BACK unimplemented";
650 break;
651 case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
652 case gl::State::DIRTY_BIT_CULL_FACE:
653 mCurrentRasterState.cullMode = gl_vk::GetCullMode(glState.getRasterizerState());
654 break;
655 case gl::State::DIRTY_BIT_FRONT_FACE:
656 mCurrentRasterState.frontFace =
657 gl_vk::GetFrontFace(glState.getRasterizerState().frontFace);
658 break;
659 case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
660 WARN() << "DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED unimplemented";
661 break;
662 case gl::State::DIRTY_BIT_POLYGON_OFFSET:
663 WARN() << "DIRTY_BIT_POLYGON_OFFSET unimplemented";
664 break;
665 case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
666 WARN() << "DIRTY_BIT_RASTERIZER_DISCARD_ENABLED unimplemented";
667 break;
668 case gl::State::DIRTY_BIT_LINE_WIDTH:
669 mCurrentRasterState.lineWidth = glState.getLineWidth();
670 break;
671 case gl::State::DIRTY_BIT_PRIMITIVE_RESTART_ENABLED:
672 WARN() << "DIRTY_BIT_PRIMITIVE_RESTART_ENABLED unimplemented";
673 break;
674 case gl::State::DIRTY_BIT_CLEAR_COLOR:
675 WARN() << "DIRTY_BIT_CLEAR_COLOR unimplemented";
676 break;
677 case gl::State::DIRTY_BIT_CLEAR_DEPTH:
678 WARN() << "DIRTY_BIT_CLEAR_DEPTH unimplemented";
679 break;
680 case gl::State::DIRTY_BIT_CLEAR_STENCIL:
681 WARN() << "DIRTY_BIT_CLEAR_STENCIL unimplemented";
682 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400683 case gl::State::DIRTY_BIT_UNPACK_STATE:
684 WARN() << "DIRTY_BIT_UNPACK_STATE unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400685 break;
Corentin Wallez29a20992017-11-06 18:23:16 -0500686 case gl::State::DIRTY_BIT_UNPACK_BUFFER_BINDING:
687 WARN() << "DIRTY_BIT_UNPACK_BUFFER_BINDING unimplemented";
688 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400689 case gl::State::DIRTY_BIT_PACK_STATE:
690 WARN() << "DIRTY_BIT_PACK_STATE unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400691 break;
Corentin Wallez29a20992017-11-06 18:23:16 -0500692 case gl::State::DIRTY_BIT_PACK_BUFFER_BINDING:
693 WARN() << "DIRTY_BIT_PACK_BUFFER_BINDING unimplemented";
694 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400695 case gl::State::DIRTY_BIT_DITHER_ENABLED:
696 WARN() << "DIRTY_BIT_DITHER_ENABLED unimplemented";
697 break;
698 case gl::State::DIRTY_BIT_GENERATE_MIPMAP_HINT:
699 WARN() << "DIRTY_BIT_GENERATE_MIPMAP_HINT unimplemented";
700 break;
701 case gl::State::DIRTY_BIT_SHADER_DERIVATIVE_HINT:
702 WARN() << "DIRTY_BIT_SHADER_DERIVATIVE_HINT unimplemented";
703 break;
704 case gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING:
705 WARN() << "DIRTY_BIT_READ_FRAMEBUFFER_BINDING unimplemented";
706 break;
707 case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
708 WARN() << "DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING unimplemented";
709 break;
710 case gl::State::DIRTY_BIT_RENDERBUFFER_BINDING:
711 WARN() << "DIRTY_BIT_RENDERBUFFER_BINDING unimplemented";
712 break;
713 case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
Jamie Madill49ac74b2017-12-21 14:42:33 -0500714 mVertexArrayDirty = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400715 break;
716 case gl::State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING:
717 WARN() << "DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING unimplemented";
718 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +0800719 case gl::State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING:
720 WARN() << "DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING unimplemented";
721 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400722 case gl::State::DIRTY_BIT_PROGRAM_BINDING:
723 WARN() << "DIRTY_BIT_PROGRAM_BINDING unimplemented";
724 break;
725 case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
726 {
727 // { vertex, fragment }
Jamie Madille1f3ad42017-10-28 23:00:42 -0400728 ProgramVk *programVk = vk::GetImpl(glState.getProgram());
Jamie Madillebf72992017-10-13 14:09:45 -0400729 mCurrentShaderStages[0].module = programVk->getLinkedVertexModule().getHandle();
730 mCurrentShaderStages[1].module = programVk->getLinkedFragmentModule().getHandle();
731
732 // Also invalidate the vertex descriptions cache in the Vertex Array.
Jamie Madille1f3ad42017-10-28 23:00:42 -0400733 VertexArrayVk *vaoVk = vk::GetImpl(glState.getVertexArray());
Jamie Madillebf72992017-10-13 14:09:45 -0400734 vaoVk->invalidateVertexDescriptions();
Jamie Madill5547b382017-10-23 18:16:01 -0400735
736 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400737 break;
738 }
739 case gl::State::DIRTY_BIT_TEXTURE_BINDINGS:
Jamie Madill5547b382017-10-23 18:16:01 -0400740 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400741 break;
742 case gl::State::DIRTY_BIT_SAMPLER_BINDINGS:
Jamie Madill5547b382017-10-23 18:16:01 -0400743 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400744 break;
Geoff Langded79232017-11-28 15:21:11 -0500745 case gl::State::DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING:
746 WARN() << "DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING unimplemented";
747 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +0800748 case gl::State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING:
749 WARN() << "DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING unimplemented";
750 break;
Jamie Madillf4141212017-12-12 15:08:07 -0500751 case gl::State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS:
752 WARN() << "DIRTY_BIT_UNIFORM_BUFFER_BINDINGS unimplemented";
753 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400754 case gl::State::DIRTY_BIT_MULTISAMPLING:
755 WARN() << "DIRTY_BIT_MULTISAMPLING unimplemented";
756 break;
757 case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_ONE:
758 WARN() << "DIRTY_BIT_SAMPLE_ALPHA_TO_ONE unimplemented";
759 break;
760 case gl::State::DIRTY_BIT_COVERAGE_MODULATION:
761 WARN() << "DIRTY_BIT_COVERAGE_MODULATION unimplemented";
762 break;
763 case gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_MV:
764 WARN() << "DIRTY_BIT_PATH_RENDERING_MATRIX_MV unimplemented";
765 break;
766 case gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ:
767 WARN() << "DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ unimplemented";
768 break;
769 case gl::State::DIRTY_BIT_PATH_RENDERING_STENCIL_STATE:
770 WARN() << "DIRTY_BIT_PATH_RENDERING_STENCIL_STATE unimplemented";
771 break;
772 case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
773 WARN() << "DIRTY_BIT_FRAMEBUFFER_SRGB unimplemented";
774 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400775 case gl::State::DIRTY_BIT_CURRENT_VALUES:
776 WARN() << "DIRTY_BIT_CURRENT_VALUES unimplemented";
777 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400778 default:
Jamie Madillc67323a2017-11-02 23:11:41 -0400779 UNREACHABLE();
Jamie Madillebf72992017-10-13 14:09:45 -0400780 break;
781 }
782 }
Jamie Madill5547b382017-10-23 18:16:01 -0400783
784 if (dirtyTextures)
785 {
Jamie Madille1f3ad42017-10-28 23:00:42 -0400786 ProgramVk *programVk = vk::GetImpl(glState.getProgram());
Jamie Madill5547b382017-10-23 18:16:01 -0400787 programVk->invalidateTextures();
Jamie Madill49ac74b2017-12-21 14:42:33 -0500788 mTexturesDirty = true;
Jamie Madill5547b382017-10-23 18:16:01 -0400789 }
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400790}
791
792GLint ContextVk::getGPUDisjoint()
793{
794 UNIMPLEMENTED();
795 return GLint();
796}
797
798GLint64 ContextVk::getTimestamp()
799{
800 UNIMPLEMENTED();
801 return GLint64();
802}
803
Jamie Madill4928b7c2017-06-20 12:57:39 -0400804void ContextVk::onMakeCurrent(const gl::Context * /*context*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400805{
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400806}
807
808const gl::Caps &ContextVk::getNativeCaps() const
809{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400810 return mRenderer->getNativeCaps();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400811}
812
813const gl::TextureCapsMap &ContextVk::getNativeTextureCaps() const
814{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400815 return mRenderer->getNativeTextureCaps();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400816}
817
818const gl::Extensions &ContextVk::getNativeExtensions() const
819{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400820 return mRenderer->getNativeExtensions();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400821}
822
823const gl::Limitations &ContextVk::getNativeLimitations() const
824{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400825 return mRenderer->getNativeLimitations();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400826}
827
828CompilerImpl *ContextVk::createCompiler()
829{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400830 return new CompilerVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400831}
832
Jamie Madillacccc6c2016-05-03 17:22:10 -0400833ShaderImpl *ContextVk::createShader(const gl::ShaderState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400834{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400835 return new ShaderVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400836}
837
Jamie Madillacccc6c2016-05-03 17:22:10 -0400838ProgramImpl *ContextVk::createProgram(const gl::ProgramState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400839{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400840 return new ProgramVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400841}
842
Jamie Madillacccc6c2016-05-03 17:22:10 -0400843FramebufferImpl *ContextVk::createFramebuffer(const gl::FramebufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400844{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500845 return FramebufferVk::CreateUserFBO(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400846}
847
848TextureImpl *ContextVk::createTexture(const gl::TextureState &state)
849{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400850 return new TextureVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400851}
852
853RenderbufferImpl *ContextVk::createRenderbuffer()
854{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400855 return new RenderbufferVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400856}
857
Jamie Madill8f775602016-11-03 16:45:34 -0400858BufferImpl *ContextVk::createBuffer(const gl::BufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400859{
Jamie Madill8f775602016-11-03 16:45:34 -0400860 return new BufferVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400861}
862
Jamie Madillacccc6c2016-05-03 17:22:10 -0400863VertexArrayImpl *ContextVk::createVertexArray(const gl::VertexArrayState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400864{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400865 return new VertexArrayVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400866}
867
868QueryImpl *ContextVk::createQuery(GLenum type)
869{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400870 return new QueryVk(type);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400871}
872
873FenceNVImpl *ContextVk::createFenceNV()
874{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400875 return new FenceNVVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400876}
877
Jamie Madill70b5bb02017-08-28 13:32:37 -0400878SyncImpl *ContextVk::createSync()
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400879{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400880 return new SyncVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400881}
882
Geoff Lang73bd2182016-07-15 13:01:24 -0400883TransformFeedbackImpl *ContextVk::createTransformFeedback(const gl::TransformFeedbackState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400884{
Geoff Lang73bd2182016-07-15 13:01:24 -0400885 return new TransformFeedbackVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400886}
887
Jamie Madill06ef36b2017-09-09 23:32:46 -0400888SamplerImpl *ContextVk::createSampler(const gl::SamplerState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400889{
Jamie Madill06ef36b2017-09-09 23:32:46 -0400890 return new SamplerVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400891}
892
Yunchao Hea336b902017-08-02 16:05:21 +0800893ProgramPipelineImpl *ContextVk::createProgramPipeline(const gl::ProgramPipelineState &state)
894{
895 return new ProgramPipelineVk(state);
896}
897
Sami Väisänene45e53b2016-05-25 10:36:04 +0300898std::vector<PathImpl *> ContextVk::createPaths(GLsizei)
899{
900 return std::vector<PathImpl *>();
901}
902
Jamie Madill72106562017-03-24 14:18:50 -0400903// TODO(jmadill): Use pipeline cache.
904void ContextVk::invalidateCurrentPipeline()
905{
Jamie Madille88ec8e2017-10-31 17:18:14 -0400906 mRenderer->releaseResource(*this, &mCurrentPipeline);
Jamie Madill72106562017-03-24 14:18:50 -0400907}
908
Jamie Madill49ac74b2017-12-21 14:42:33 -0500909void ContextVk::onVertexArrayChange()
910{
911 // TODO(jmadill): Does not handle dependent state changes.
912 mVertexArrayDirty = true;
913 invalidateCurrentPipeline();
914}
915
Jamie Madillfe548342017-06-19 11:13:24 -0400916gl::Error ContextVk::dispatchCompute(const gl::Context *context,
917 GLuint numGroupsX,
918 GLuint numGroupsY,
919 GLuint numGroupsZ)
Xinghua Cao2b396592017-03-29 15:36:04 +0800920{
921 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500922 return gl::InternalError();
Xinghua Cao2b396592017-03-29 15:36:04 +0800923}
924
Qin Jiajia62fcf622017-11-30 16:16:12 +0800925gl::Error ContextVk::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
926{
927 UNIMPLEMENTED();
928 return gl::InternalError();
929}
930
Xinghua Cao89c422a2017-11-29 18:24:20 +0800931gl::Error ContextVk::memoryBarrier(const gl::Context *context, GLbitfield barriers)
932{
933 UNIMPLEMENTED();
934 return gl::InternalError();
935}
936
937gl::Error ContextVk::memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers)
938{
939 UNIMPLEMENTED();
940 return gl::InternalError();
941}
942
Jamie Madill76e471e2017-10-21 09:56:01 -0400943vk::DescriptorPool *ContextVk::getDescriptorPool()
944{
945 return &mDescriptorPool;
946}
947
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400948} // namespace rx