blob: b9b74ba366b3f63ce7a1f2fe744e4f4c41b8e1e5 [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"
17#include "libANGLE/renderer/vulkan/CompilerVk.h"
18#include "libANGLE/renderer/vulkan/ContextVk.h"
19#include "libANGLE/renderer/vulkan/DeviceVk.h"
20#include "libANGLE/renderer/vulkan/FenceNVVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040021#include "libANGLE/renderer/vulkan/FramebufferVk.h"
22#include "libANGLE/renderer/vulkan/ImageVk.h"
Yunchao Hea336b902017-08-02 16:05:21 +080023#include "libANGLE/renderer/vulkan/ProgramPipelineVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040024#include "libANGLE/renderer/vulkan/ProgramVk.h"
25#include "libANGLE/renderer/vulkan/QueryVk.h"
26#include "libANGLE/renderer/vulkan/RenderbufferVk.h"
27#include "libANGLE/renderer/vulkan/RendererVk.h"
28#include "libANGLE/renderer/vulkan/SamplerVk.h"
29#include "libANGLE/renderer/vulkan/ShaderVk.h"
Jamie Madill70b5bb02017-08-28 13:32:37 -040030#include "libANGLE/renderer/vulkan/SyncVk.h"
Jamie Madillacccc6c2016-05-03 17:22:10 -040031#include "libANGLE/renderer/vulkan/TextureVk.h"
32#include "libANGLE/renderer/vulkan/TransformFeedbackVk.h"
33#include "libANGLE/renderer/vulkan/VertexArrayVk.h"
Jamie Madilldf68a6f2017-01-13 17:29:53 -050034#include "libANGLE/renderer/vulkan/formatutilsvk.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040035
36namespace rx
37{
38
Jamie Madilld03a8492017-10-03 15:46:06 -040039namespace
40{
41
42VkIndexType GetVkIndexType(GLenum glIndexType)
43{
44 switch (glIndexType)
45 {
46 case GL_UNSIGNED_SHORT:
47 return VK_INDEX_TYPE_UINT16;
48 case GL_UNSIGNED_INT:
49 return VK_INDEX_TYPE_UINT32;
50 default:
51 UNREACHABLE();
52 return VK_INDEX_TYPE_MAX_ENUM;
53 }
54}
55
Jamie Madill76e471e2017-10-21 09:56:01 -040056enum DescriptorPoolIndex : uint8_t
57{
58 UniformBufferPool = 0,
59 TexturePool = 1,
60};
61
Jamie Madilld03a8492017-10-03 15:46:06 -040062} // anonymous namespace
63
Jamie Madillacccc6c2016-05-03 17:22:10 -040064ContextVk::ContextVk(const gl::ContextState &state, RendererVk *renderer)
Jamie Madill72106562017-03-24 14:18:50 -040065 : ContextImpl(state), mRenderer(renderer), mCurrentDrawMode(GL_NONE)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040066{
Jamie Madillebf72992017-10-13 14:09:45 -040067 // The module handle is filled out at draw time.
68 mCurrentShaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
69 mCurrentShaderStages[0].pNext = nullptr;
70 mCurrentShaderStages[0].flags = 0;
71 mCurrentShaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
72 mCurrentShaderStages[0].module = VK_NULL_HANDLE;
73 mCurrentShaderStages[0].pName = "main";
74 mCurrentShaderStages[0].pSpecializationInfo = nullptr;
75
76 mCurrentShaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
77 mCurrentShaderStages[1].pNext = nullptr;
78 mCurrentShaderStages[1].flags = 0;
79 mCurrentShaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
80 mCurrentShaderStages[1].module = VK_NULL_HANDLE;
81 mCurrentShaderStages[1].pName = "main";
82 mCurrentShaderStages[1].pSpecializationInfo = nullptr;
83
84 // The binding descriptions are filled in at draw time.
85 mCurrentVertexInputState.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
86 mCurrentVertexInputState.pNext = nullptr;
87 mCurrentVertexInputState.flags = 0;
88 mCurrentVertexInputState.vertexBindingDescriptionCount = 0;
89 mCurrentVertexInputState.pVertexBindingDescriptions = nullptr;
90 mCurrentVertexInputState.vertexAttributeDescriptionCount = 0;
91 mCurrentVertexInputState.pVertexAttributeDescriptions = nullptr;
92
93 // Primitive topology is filled in at draw time.
94 mCurrentInputAssemblyState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
95 mCurrentInputAssemblyState.pNext = nullptr;
96 mCurrentInputAssemblyState.flags = 0;
97 mCurrentInputAssemblyState.topology = gl_vk::GetPrimitiveTopology(mCurrentDrawMode);
98 mCurrentInputAssemblyState.primitiveRestartEnable = VK_FALSE;
99
100 // Set initial viewport and scissor state.
101 mCurrentViewportVk.x = 0.0f;
102 mCurrentViewportVk.y = 0.0f;
103 mCurrentViewportVk.width = 0.0f;
104 mCurrentViewportVk.height = 0.0f;
105 mCurrentViewportVk.minDepth = 0.0f;
106 mCurrentViewportVk.maxDepth = 1.0f;
107
108 mCurrentScissorVk.offset.x = 0;
109 mCurrentScissorVk.offset.y = 0;
110 mCurrentScissorVk.extent.width = 0u;
111 mCurrentScissorVk.extent.height = 0u;
112
113 mCurrentViewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
114 mCurrentViewportState.pNext = nullptr;
115 mCurrentViewportState.flags = 0;
116 mCurrentViewportState.viewportCount = 1;
117 mCurrentViewportState.pViewports = &mCurrentViewportVk;
118 mCurrentViewportState.scissorCount = 1;
119 mCurrentViewportState.pScissors = &mCurrentScissorVk;
120
121 // Set initial rasterizer state.
122 // TODO(jmadill): Extra rasterizer state features.
123 mCurrentRasterState.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
124 mCurrentRasterState.pNext = nullptr;
125 mCurrentRasterState.flags = 0;
126 mCurrentRasterState.depthClampEnable = VK_FALSE;
127 mCurrentRasterState.rasterizerDiscardEnable = VK_FALSE;
128 mCurrentRasterState.polygonMode = VK_POLYGON_MODE_FILL;
129 mCurrentRasterState.cullMode = VK_CULL_MODE_NONE;
130 mCurrentRasterState.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
131 mCurrentRasterState.depthBiasEnable = VK_FALSE;
132 mCurrentRasterState.depthBiasConstantFactor = 0.0f;
133 mCurrentRasterState.depthBiasClamp = 0.0f;
134 mCurrentRasterState.depthBiasSlopeFactor = 0.0f;
135 mCurrentRasterState.lineWidth = 1.0f;
136
137 // Initialize a dummy multisample state.
138 // TODO(jmadill): Multisample state.
139 mCurrentMultisampleState.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
140 mCurrentMultisampleState.pNext = nullptr;
141 mCurrentMultisampleState.flags = 0;
142 mCurrentMultisampleState.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
143 mCurrentMultisampleState.sampleShadingEnable = VK_FALSE;
144 mCurrentMultisampleState.minSampleShading = 0.0f;
145 mCurrentMultisampleState.pSampleMask = nullptr;
146 mCurrentMultisampleState.alphaToCoverageEnable = VK_FALSE;
147 mCurrentMultisampleState.alphaToOneEnable = VK_FALSE;
148
149 // TODO(jmadill): Depth/stencil state.
150
151 // Initialize a dummy MRT blend state.
152 // TODO(jmadill): Blend state/MRT.
153 mCurrentBlendAttachmentState.blendEnable = VK_FALSE;
154 mCurrentBlendAttachmentState.srcColorBlendFactor = VK_BLEND_FACTOR_ONE;
155 mCurrentBlendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ONE;
156 mCurrentBlendAttachmentState.colorBlendOp = VK_BLEND_OP_ADD;
157 mCurrentBlendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
158 mCurrentBlendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
159 mCurrentBlendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD;
160 mCurrentBlendAttachmentState.colorWriteMask =
161 (VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT |
162 VK_COLOR_COMPONENT_A_BIT);
163
164 mCurrentBlendState.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
165 mCurrentBlendState.pNext = 0;
166 mCurrentBlendState.flags = 0;
167 mCurrentBlendState.logicOpEnable = VK_FALSE;
168 mCurrentBlendState.logicOp = VK_LOGIC_OP_CLEAR;
169 mCurrentBlendState.attachmentCount = 1;
170 mCurrentBlendState.pAttachments = &mCurrentBlendAttachmentState;
171 mCurrentBlendState.blendConstants[0] = 0.0f;
172 mCurrentBlendState.blendConstants[1] = 0.0f;
173 mCurrentBlendState.blendConstants[2] = 0.0f;
174 mCurrentBlendState.blendConstants[3] = 0.0f;
175
176 // TODO(jmadill): Dynamic state.
177
178 // The layout and renderpass are filled out at draw time.
179 mCurrentPipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
180 mCurrentPipelineInfo.pNext = nullptr;
181 mCurrentPipelineInfo.flags = 0;
182 mCurrentPipelineInfo.stageCount = 2;
183 mCurrentPipelineInfo.pStages = mCurrentShaderStages;
184 mCurrentPipelineInfo.pVertexInputState = &mCurrentVertexInputState;
185 mCurrentPipelineInfo.pInputAssemblyState = &mCurrentInputAssemblyState;
186 mCurrentPipelineInfo.pTessellationState = nullptr;
187 mCurrentPipelineInfo.pViewportState = &mCurrentViewportState;
188 mCurrentPipelineInfo.pRasterizationState = &mCurrentRasterState;
189 mCurrentPipelineInfo.pMultisampleState = &mCurrentMultisampleState;
190 mCurrentPipelineInfo.pDepthStencilState = nullptr;
191 mCurrentPipelineInfo.pColorBlendState = &mCurrentBlendState;
192 mCurrentPipelineInfo.pDynamicState = nullptr;
193 mCurrentPipelineInfo.layout = VK_NULL_HANDLE;
194 mCurrentPipelineInfo.renderPass = VK_NULL_HANDLE;
195 mCurrentPipelineInfo.subpass = 0;
196 mCurrentPipelineInfo.basePipelineHandle = VK_NULL_HANDLE;
197 mCurrentPipelineInfo.basePipelineIndex = 0;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400198}
199
200ContextVk::~ContextVk()
201{
Jamie Madill72106562017-03-24 14:18:50 -0400202 invalidateCurrentPipeline();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400203}
204
Jamie Madill76e471e2017-10-21 09:56:01 -0400205void ContextVk::onDestroy(const gl::Context *context)
206{
207 VkDevice device = mRenderer->getDevice();
208
209 mDescriptorPool.destroy(device);
210}
211
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400212gl::Error ContextVk::initialize()
213{
Jamie Madill76e471e2017-10-21 09:56:01 -0400214 VkDevice device = mRenderer->getDevice();
215
216 VkDescriptorPoolSize poolSizes[2];
217 poolSizes[UniformBufferPool].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
218 poolSizes[UniformBufferPool].descriptorCount = 1024;
219 poolSizes[TexturePool].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
220 poolSizes[TexturePool].descriptorCount = 1024;
221
222 VkDescriptorPoolCreateInfo descriptorPoolInfo;
223 descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
224 descriptorPoolInfo.pNext = nullptr;
225 descriptorPoolInfo.flags = 0;
226
227 // TODO(jmadill): Pick non-arbitrary max.
228 descriptorPoolInfo.maxSets = 2048;
229
230 // Reserve pools for uniform blocks and textures.
231 descriptorPoolInfo.poolSizeCount = 2;
232 descriptorPoolInfo.pPoolSizes = poolSizes;
233
234 ANGLE_TRY(mDescriptorPool.init(device, descriptorPoolInfo));
235
Jamie Madille09bd5d2016-11-29 16:20:35 -0500236 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400237}
238
Jamie Madillafa02a22017-11-23 12:57:38 -0500239gl::Error ContextVk::flush(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400240{
241 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500242 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400243}
244
Jamie Madillafa02a22017-11-23 12:57:38 -0500245gl::Error ContextVk::finish(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400246{
Jamie Madillbd159f02017-10-09 19:39:06 -0400247 // TODO(jmadill): Implement finish.
248 // UNIMPLEMENTED();
249 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400250}
251
Jamie Madill4928b7c2017-06-20 12:57:39 -0400252gl::Error ContextVk::initPipeline(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400253{
Jamie Madill72106562017-03-24 14:18:50 -0400254 ASSERT(!mCurrentPipeline.valid());
255
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500256 VkDevice device = mRenderer->getDevice();
257 const auto &state = mState.getState();
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500258 const gl::Program *programGL = state.getProgram();
259 const gl::VertexArray *vao = state.getVertexArray();
260 const gl::Framebuffer *drawFBO = state.getDrawFramebuffer();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400261 ProgramVk *programVk = vk::GetImpl(programGL);
262 FramebufferVk *vkFBO = vk::GetImpl(drawFBO);
263 VertexArrayVk *vkVAO = vk::GetImpl(vao);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500264
Jamie Madillebf72992017-10-13 14:09:45 -0400265 // Ensure the attribs and bindings are updated.
266 vkVAO->updateVertexDescriptions(context);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500267
Jamie Madillebf72992017-10-13 14:09:45 -0400268 const auto &vertexBindings = vkVAO->getVertexBindingDescs();
269 const auto &vertexAttribs = vkVAO->getVertexAttribDescs();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500270
271 // TODO(jmadill): Validate with ASSERT against physical device limits/caps?
Jamie Madillebf72992017-10-13 14:09:45 -0400272 mCurrentVertexInputState.vertexBindingDescriptionCount =
273 static_cast<uint32_t>(vertexBindings.size());
274 mCurrentVertexInputState.pVertexBindingDescriptions = vertexBindings.data();
275 mCurrentVertexInputState.vertexAttributeDescriptionCount =
276 static_cast<uint32_t>(vertexAttribs.size());
277 mCurrentVertexInputState.pVertexAttributeDescriptions = vertexAttribs.data();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500278
Jamie Madillebf72992017-10-13 14:09:45 -0400279 mCurrentInputAssemblyState.topology = gl_vk::GetPrimitiveTopology(mCurrentDrawMode);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500280
Jamie Madill9f2a8612017-11-30 12:43:09 -0500281 const vk::RenderPassDesc &desc = vkFBO->getRenderPassDesc(context);
282
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500283 vk::RenderPass *renderPass = nullptr;
Jamie Madill9f2a8612017-11-30 12:43:09 -0500284 ANGLE_TRY(mRenderer->getCompatibleRenderPass(desc, &renderPass));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500285 ASSERT(renderPass && renderPass->valid());
286
Jamie Madillc5143482017-10-15 20:20:06 -0400287 const vk::PipelineLayout &pipelineLayout = programVk->getPipelineLayout();
288 ASSERT(pipelineLayout.valid());
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500289
Jamie Madillc5143482017-10-15 20:20:06 -0400290 mCurrentPipelineInfo.layout = pipelineLayout.getHandle();
Jamie Madillebf72992017-10-13 14:09:45 -0400291 mCurrentPipelineInfo.renderPass = renderPass->getHandle();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500292
Jamie Madill25301b62017-10-28 20:59:31 -0400293 ANGLE_TRY(mCurrentPipeline.initGraphics(device, mCurrentPipelineInfo));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500294
Jamie Madill72106562017-03-24 14:18:50 -0400295 return gl::NoError();
296}
297
Jamie Madillda854a22017-11-30 17:24:21 -0500298gl::Error ContextVk::setupDraw(const gl::Context *context, GLenum mode, DrawType drawType)
Jamie Madill72106562017-03-24 14:18:50 -0400299{
300 if (mode != mCurrentDrawMode)
301 {
302 invalidateCurrentPipeline();
303 mCurrentDrawMode = mode;
304 }
305
306 if (!mCurrentPipeline.valid())
307 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400308 ANGLE_TRY(initPipeline(context));
Jamie Madill72106562017-03-24 14:18:50 -0400309 ASSERT(mCurrentPipeline.valid());
310 }
311
Jamie Madill72106562017-03-24 14:18:50 -0400312 const auto &state = mState.getState();
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500313 const gl::Program *programGL = state.getProgram();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400314 ProgramVk *programVk = vk::GetImpl(programGL);
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500315 const gl::VertexArray *vao = state.getVertexArray();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400316 VertexArrayVk *vkVAO = vk::GetImpl(vao);
Jamie Madill72106562017-03-24 14:18:50 -0400317 const auto *drawFBO = state.getDrawFramebuffer();
Jamie Madille1f3ad42017-10-28 23:00:42 -0400318 FramebufferVk *vkFBO = vk::GetImpl(drawFBO);
Jamie Madill72106562017-03-24 14:18:50 -0400319 Serial queueSerial = mRenderer->getCurrentQueueSerial();
Jamie Madillbd159f02017-10-09 19:39:06 -0400320 uint32_t maxAttrib = programGL->getState().getMaxActiveAttribLocation();
Jamie Madill72106562017-03-24 14:18:50 -0400321
Jamie Madillbd159f02017-10-09 19:39:06 -0400322 // Process vertex attributes. Assume zero offsets for now.
323 // TODO(jmadill): Offset handling.
Jamie Madillda854a22017-11-30 17:24:21 -0500324 const auto &vertexHandles = vkVAO->getCurrentArrayBufferHandles();
325 angle::MemoryBuffer *zeroBuf = nullptr;
Jamie Madillbd159f02017-10-09 19:39:06 -0400326 ANGLE_TRY(context->getZeroFilledBuffer(maxAttrib * sizeof(VkDeviceSize), &zeroBuf));
Jamie Madill72106562017-03-24 14:18:50 -0400327
Jamie Madill7f738d42017-11-20 17:06:27 -0500328 vk::CommandBufferAndState *commandBuffer = nullptr;
Jamie Madill0c0dc342017-03-24 14:18:51 -0400329 ANGLE_TRY(mRenderer->getStartedCommandBuffer(&commandBuffer));
Jamie Madill1b038242017-11-01 15:14:36 -0400330 ANGLE_TRY(mRenderer->ensureInRenderPass(context, vkFBO));
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500331
332 commandBuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, mCurrentPipeline);
Jamie Madillbd159f02017-10-09 19:39:06 -0400333 commandBuffer->bindVertexBuffers(0, maxAttrib, vertexHandles.data(),
334 reinterpret_cast<const VkDeviceSize *>(zeroBuf->data()));
335
Jamie Madillabd31352017-09-19 00:24:58 -0400336 // TODO(jmadill): the queue serial should be bound to the pipeline.
337 setQueueSerial(queueSerial);
Jamie Madillda854a22017-11-30 17:24:21 -0500338 vkVAO->updateCurrentBufferSerials(programGL->getActiveAttribLocationsMask(), queueSerial,
339 drawType);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500340
Jamie Madill76e471e2017-10-21 09:56:01 -0400341 // TODO(jmadill): Can probably use more dirty bits here.
Jamie Madille1f3ad42017-10-28 23:00:42 -0400342 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill76e471e2017-10-21 09:56:01 -0400343 ANGLE_TRY(programVk->updateUniforms(contextVk));
Jamie Madill5547b382017-10-23 18:16:01 -0400344 programVk->updateTexturesDescriptorSet(contextVk);
Jamie Madill76e471e2017-10-21 09:56:01 -0400345
346 // Bind the graphics descriptor sets.
347 // TODO(jmadill): Handle multiple command buffers.
Jamie Madill5547b382017-10-23 18:16:01 -0400348 const auto &descriptorSets = programVk->getDescriptorSets();
349 uint32_t firstSet = programVk->getDescriptorSetOffset();
350 uint32_t setCount = static_cast<uint32_t>(descriptorSets.size());
351 if (!descriptorSets.empty() && ((setCount - firstSet) > 0))
Jamie Madill76e471e2017-10-21 09:56:01 -0400352 {
353 const vk::PipelineLayout &pipelineLayout = programVk->getPipelineLayout();
Jamie Madill5547b382017-10-23 18:16:01 -0400354 commandBuffer->bindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, firstSet,
355 setCount - firstSet, &descriptorSets[firstSet], 0,
356 nullptr);
Jamie Madill76e471e2017-10-21 09:56:01 -0400357 }
358
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500359 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400360}
361
Jamie Madilld03a8492017-10-03 15:46:06 -0400362gl::Error ContextVk::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
363{
Jamie Madillda854a22017-11-30 17:24:21 -0500364 ANGLE_TRY(setupDraw(context, mode, DrawType::Arrays));
Jamie Madilld03a8492017-10-03 15:46:06 -0400365
Jamie Madill7f738d42017-11-20 17:06:27 -0500366 vk::CommandBufferAndState *commandBuffer = nullptr;
Jamie Madilld03a8492017-10-03 15:46:06 -0400367 ANGLE_TRY(mRenderer->getStartedCommandBuffer(&commandBuffer));
368
369 commandBuffer->draw(count, 1, first, 0);
370 return gl::NoError();
371}
372
Jamie Madillc564c072017-06-01 12:45:42 -0400373gl::Error ContextVk::drawArraysInstanced(const gl::Context *context,
374 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400375 GLint first,
376 GLsizei count,
377 GLsizei instanceCount)
378{
379 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500380 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400381}
382
Jamie Madillc564c072017-06-01 12:45:42 -0400383gl::Error ContextVk::drawElements(const gl::Context *context,
384 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400385 GLsizei count,
386 GLenum type,
Qin Jiajia1da00652017-06-20 17:16:25 +0800387 const void *indices)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400388{
Jamie Madillda854a22017-11-30 17:24:21 -0500389 ANGLE_TRY(setupDraw(context, mode, DrawType::Elements));
Jamie Madilld03a8492017-10-03 15:46:06 -0400390
391 if (indices)
392 {
393 // TODO(jmadill): Buffer offsets and immediate data.
394 UNIMPLEMENTED();
395 return gl::InternalError() << "Only zero-offset index buffers are currently implemented.";
396 }
397
398 if (type == GL_UNSIGNED_BYTE)
399 {
400 // TODO(jmadill): Index translation.
401 UNIMPLEMENTED();
402 return gl::InternalError() << "Unsigned byte translation is not yet implemented.";
403 }
404
Jamie Madill7f738d42017-11-20 17:06:27 -0500405 vk::CommandBufferAndState *commandBuffer = nullptr;
Jamie Madilld03a8492017-10-03 15:46:06 -0400406 ANGLE_TRY(mRenderer->getStartedCommandBuffer(&commandBuffer));
407
408 const gl::Buffer *elementArrayBuffer =
409 mState.getState().getVertexArray()->getElementArrayBuffer().get();
410 ASSERT(elementArrayBuffer);
411
Jamie Madille1f3ad42017-10-28 23:00:42 -0400412 BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer);
Jamie Madilld03a8492017-10-03 15:46:06 -0400413
414 commandBuffer->bindIndexBuffer(elementArrayBufferVk->getVkBuffer(), 0, GetVkIndexType(type));
415 commandBuffer->drawIndexed(count, 1, 0, 0, 0);
416
417 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400418}
419
Jamie Madillc564c072017-06-01 12:45:42 -0400420gl::Error ContextVk::drawElementsInstanced(const gl::Context *context,
421 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400422 GLsizei count,
423 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400424 const void *indices,
Qin Jiajia1da00652017-06-20 17:16:25 +0800425 GLsizei instances)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400426{
427 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500428 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400429}
430
Jamie Madillc564c072017-06-01 12:45:42 -0400431gl::Error ContextVk::drawRangeElements(const gl::Context *context,
432 GLenum mode,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400433 GLuint start,
434 GLuint end,
435 GLsizei count,
436 GLenum type,
Qin Jiajia1da00652017-06-20 17:16:25 +0800437 const void *indices)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400438{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500439 return gl::NoError();
440}
441
442VkDevice ContextVk::getDevice() const
443{
444 return mRenderer->getDevice();
445}
446
Jamie Madill7f738d42017-11-20 17:06:27 -0500447vk::Error ContextVk::getStartedCommandBuffer(vk::CommandBufferAndState **commandBufferOut)
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500448{
Jamie Madill0c0dc342017-03-24 14:18:51 -0400449 return mRenderer->getStartedCommandBuffer(commandBufferOut);
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500450}
451
Jamie Madill7f738d42017-11-20 17:06:27 -0500452vk::Error ContextVk::submitCommands(vk::CommandBufferAndState *commandBuffer)
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500453{
Jamie Madill72106562017-03-24 14:18:50 -0400454 setQueueSerial(mRenderer->getCurrentQueueSerial());
Jamie Madillf651c772017-02-21 15:03:51 -0500455 ANGLE_TRY(mRenderer->submitCommandBuffer(commandBuffer));
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500456 return vk::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400457}
458
Jamie Madillc564c072017-06-01 12:45:42 -0400459gl::Error ContextVk::drawArraysIndirect(const gl::Context *context,
460 GLenum mode,
461 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800462{
463 UNIMPLEMENTED();
464 return gl::InternalError() << "DrawArraysIndirect hasn't been implemented for vulkan backend.";
465}
466
Jamie Madillc564c072017-06-01 12:45:42 -0400467gl::Error ContextVk::drawElementsIndirect(const gl::Context *context,
468 GLenum mode,
469 GLenum type,
470 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800471{
472 UNIMPLEMENTED();
473 return gl::InternalError()
474 << "DrawElementsIndirect hasn't been implemented for vulkan backend.";
475}
476
Corentin Wallez87fbe1c2016-08-03 14:41:42 -0400477GLenum ContextVk::getResetStatus()
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400478{
479 UNIMPLEMENTED();
Corentin Wallez87fbe1c2016-08-03 14:41:42 -0400480 return GL_NO_ERROR;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400481}
482
483std::string ContextVk::getVendorString() const
484{
485 UNIMPLEMENTED();
486 return std::string();
487}
488
489std::string ContextVk::getRendererDescription() const
490{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500491 return mRenderer->getRendererDescription();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400492}
493
494void ContextVk::insertEventMarker(GLsizei length, const char *marker)
495{
496 UNIMPLEMENTED();
497}
498
499void ContextVk::pushGroupMarker(GLsizei length, const char *marker)
500{
501 UNIMPLEMENTED();
502}
503
504void ContextVk::popGroupMarker()
505{
506 UNIMPLEMENTED();
507}
508
Geoff Lang5d5253a2017-11-22 14:51:12 -0500509void ContextVk::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message)
510{
511 UNIMPLEMENTED();
512}
513
514void ContextVk::popDebugGroup()
515{
516 UNIMPLEMENTED();
517}
518
Jamie Madillfe548342017-06-19 11:13:24 -0400519void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400520{
Jamie Madill72106562017-03-24 14:18:50 -0400521 if (dirtyBits.any())
522 {
523 invalidateCurrentPipeline();
524 }
Jamie Madillebf72992017-10-13 14:09:45 -0400525
526 const auto &glState = context->getGLState();
527
528 // TODO(jmadill): Full dirty bits implementation.
Jamie Madill5547b382017-10-23 18:16:01 -0400529 bool dirtyTextures = false;
Jamie Madillebf72992017-10-13 14:09:45 -0400530
531 for (auto dirtyBit : dirtyBits)
532 {
533 switch (dirtyBit)
534 {
535 case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
536 WARN() << "DIRTY_BIT_SCISSOR_TEST_ENABLED unimplemented";
537 break;
538 case gl::State::DIRTY_BIT_SCISSOR:
539 WARN() << "DIRTY_BIT_SCISSOR unimplemented";
540 break;
541 case gl::State::DIRTY_BIT_VIEWPORT:
542 {
543 const gl::Rectangle &viewportGL = glState.getViewport();
544 mCurrentViewportVk.x = static_cast<float>(viewportGL.x);
545 mCurrentViewportVk.y = static_cast<float>(viewportGL.y);
546 mCurrentViewportVk.width = static_cast<float>(viewportGL.width);
547 mCurrentViewportVk.height = static_cast<float>(viewportGL.height);
548 mCurrentViewportVk.minDepth = glState.getNearPlane();
549 mCurrentViewportVk.maxDepth = glState.getFarPlane();
550
551 // TODO(jmadill): Scissor.
552 mCurrentScissorVk.offset.x = viewportGL.x;
553 mCurrentScissorVk.offset.y = viewportGL.y;
554 mCurrentScissorVk.extent.width = viewportGL.width;
555 mCurrentScissorVk.extent.height = viewportGL.height;
556 break;
557 }
558 case gl::State::DIRTY_BIT_DEPTH_RANGE:
559 WARN() << "DIRTY_BIT_DEPTH_RANGE unimplemented";
560 break;
561 case gl::State::DIRTY_BIT_BLEND_ENABLED:
562 WARN() << "DIRTY_BIT_BLEND_ENABLED unimplemented";
563 break;
564 case gl::State::DIRTY_BIT_BLEND_COLOR:
565 WARN() << "DIRTY_BIT_BLEND_COLOR unimplemented";
566 break;
567 case gl::State::DIRTY_BIT_BLEND_FUNCS:
568 WARN() << "DIRTY_BIT_BLEND_FUNCS unimplemented";
569 break;
570 case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
571 WARN() << "DIRTY_BIT_BLEND_EQUATIONS unimplemented";
572 break;
573 case gl::State::DIRTY_BIT_COLOR_MASK:
574 WARN() << "DIRTY_BIT_COLOR_MASK unimplemented";
575 break;
576 case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
577 WARN() << "DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED unimplemented";
578 break;
579 case gl::State::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED:
580 WARN() << "DIRTY_BIT_SAMPLE_COVERAGE_ENABLED unimplemented";
581 break;
582 case gl::State::DIRTY_BIT_SAMPLE_COVERAGE:
583 WARN() << "DIRTY_BIT_SAMPLE_COVERAGE unimplemented";
584 break;
585 case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED:
586 WARN() << "DIRTY_BIT_SAMPLE_MASK_ENABLED unimplemented";
587 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400588 case gl::State::DIRTY_BIT_SAMPLE_MASK:
589 WARN() << "DIRTY_BIT_SAMPLE_MASK unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400590 break;
591 case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
592 WARN() << "DIRTY_BIT_DEPTH_TEST_ENABLED unimplemented";
593 break;
594 case gl::State::DIRTY_BIT_DEPTH_FUNC:
595 WARN() << "DIRTY_BIT_DEPTH_FUNC unimplemented";
596 break;
597 case gl::State::DIRTY_BIT_DEPTH_MASK:
598 WARN() << "DIRTY_BIT_DEPTH_MASK unimplemented";
599 break;
600 case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
601 WARN() << "DIRTY_BIT_STENCIL_TEST_ENABLED unimplemented";
602 break;
603 case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
604 WARN() << "DIRTY_BIT_STENCIL_FUNCS_FRONT unimplemented";
605 break;
606 case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
607 WARN() << "DIRTY_BIT_STENCIL_FUNCS_BACK unimplemented";
608 break;
609 case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
610 WARN() << "DIRTY_BIT_STENCIL_OPS_FRONT unimplemented";
611 break;
612 case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
613 WARN() << "DIRTY_BIT_STENCIL_OPS_BACK unimplemented";
614 break;
615 case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
616 WARN() << "DIRTY_BIT_STENCIL_WRITEMASK_FRONT unimplemented";
617 break;
618 case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
619 WARN() << "DIRTY_BIT_STENCIL_WRITEMASK_BACK unimplemented";
620 break;
621 case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
622 case gl::State::DIRTY_BIT_CULL_FACE:
623 mCurrentRasterState.cullMode = gl_vk::GetCullMode(glState.getRasterizerState());
624 break;
625 case gl::State::DIRTY_BIT_FRONT_FACE:
626 mCurrentRasterState.frontFace =
627 gl_vk::GetFrontFace(glState.getRasterizerState().frontFace);
628 break;
629 case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
630 WARN() << "DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED unimplemented";
631 break;
632 case gl::State::DIRTY_BIT_POLYGON_OFFSET:
633 WARN() << "DIRTY_BIT_POLYGON_OFFSET unimplemented";
634 break;
635 case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
636 WARN() << "DIRTY_BIT_RASTERIZER_DISCARD_ENABLED unimplemented";
637 break;
638 case gl::State::DIRTY_BIT_LINE_WIDTH:
639 mCurrentRasterState.lineWidth = glState.getLineWidth();
640 break;
641 case gl::State::DIRTY_BIT_PRIMITIVE_RESTART_ENABLED:
642 WARN() << "DIRTY_BIT_PRIMITIVE_RESTART_ENABLED unimplemented";
643 break;
644 case gl::State::DIRTY_BIT_CLEAR_COLOR:
645 WARN() << "DIRTY_BIT_CLEAR_COLOR unimplemented";
646 break;
647 case gl::State::DIRTY_BIT_CLEAR_DEPTH:
648 WARN() << "DIRTY_BIT_CLEAR_DEPTH unimplemented";
649 break;
650 case gl::State::DIRTY_BIT_CLEAR_STENCIL:
651 WARN() << "DIRTY_BIT_CLEAR_STENCIL unimplemented";
652 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400653 case gl::State::DIRTY_BIT_UNPACK_STATE:
654 WARN() << "DIRTY_BIT_UNPACK_STATE unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400655 break;
Corentin Wallez29a20992017-11-06 18:23:16 -0500656 case gl::State::DIRTY_BIT_UNPACK_BUFFER_BINDING:
657 WARN() << "DIRTY_BIT_UNPACK_BUFFER_BINDING unimplemented";
658 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400659 case gl::State::DIRTY_BIT_PACK_STATE:
660 WARN() << "DIRTY_BIT_PACK_STATE unimplemented";
Jamie Madillebf72992017-10-13 14:09:45 -0400661 break;
Corentin Wallez29a20992017-11-06 18:23:16 -0500662 case gl::State::DIRTY_BIT_PACK_BUFFER_BINDING:
663 WARN() << "DIRTY_BIT_PACK_BUFFER_BINDING unimplemented";
664 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400665 case gl::State::DIRTY_BIT_DITHER_ENABLED:
666 WARN() << "DIRTY_BIT_DITHER_ENABLED unimplemented";
667 break;
668 case gl::State::DIRTY_BIT_GENERATE_MIPMAP_HINT:
669 WARN() << "DIRTY_BIT_GENERATE_MIPMAP_HINT unimplemented";
670 break;
671 case gl::State::DIRTY_BIT_SHADER_DERIVATIVE_HINT:
672 WARN() << "DIRTY_BIT_SHADER_DERIVATIVE_HINT unimplemented";
673 break;
674 case gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING:
675 WARN() << "DIRTY_BIT_READ_FRAMEBUFFER_BINDING unimplemented";
676 break;
677 case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
678 WARN() << "DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING unimplemented";
679 break;
680 case gl::State::DIRTY_BIT_RENDERBUFFER_BINDING:
681 WARN() << "DIRTY_BIT_RENDERBUFFER_BINDING unimplemented";
682 break;
683 case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
684 WARN() << "DIRTY_BIT_VERTEX_ARRAY_BINDING unimplemented";
685 break;
686 case gl::State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING:
687 WARN() << "DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING unimplemented";
688 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +0800689 case gl::State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING:
690 WARN() << "DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING unimplemented";
691 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400692 case gl::State::DIRTY_BIT_PROGRAM_BINDING:
693 WARN() << "DIRTY_BIT_PROGRAM_BINDING unimplemented";
694 break;
695 case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
696 {
697 // { vertex, fragment }
Jamie Madille1f3ad42017-10-28 23:00:42 -0400698 ProgramVk *programVk = vk::GetImpl(glState.getProgram());
Jamie Madillebf72992017-10-13 14:09:45 -0400699 mCurrentShaderStages[0].module = programVk->getLinkedVertexModule().getHandle();
700 mCurrentShaderStages[1].module = programVk->getLinkedFragmentModule().getHandle();
701
702 // Also invalidate the vertex descriptions cache in the Vertex Array.
Jamie Madille1f3ad42017-10-28 23:00:42 -0400703 VertexArrayVk *vaoVk = vk::GetImpl(glState.getVertexArray());
Jamie Madillebf72992017-10-13 14:09:45 -0400704 vaoVk->invalidateVertexDescriptions();
Jamie Madill5547b382017-10-23 18:16:01 -0400705
706 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400707 break;
708 }
709 case gl::State::DIRTY_BIT_TEXTURE_BINDINGS:
Jamie Madill5547b382017-10-23 18:16:01 -0400710 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400711 break;
712 case gl::State::DIRTY_BIT_SAMPLER_BINDINGS:
Jamie Madill5547b382017-10-23 18:16:01 -0400713 dirtyTextures = true;
Jamie Madillebf72992017-10-13 14:09:45 -0400714 break;
Geoff Langded79232017-11-28 15:21:11 -0500715 case gl::State::DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING:
716 WARN() << "DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING unimplemented";
717 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +0800718 case gl::State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING:
719 WARN() << "DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING unimplemented";
720 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400721 case gl::State::DIRTY_BIT_MULTISAMPLING:
722 WARN() << "DIRTY_BIT_MULTISAMPLING unimplemented";
723 break;
724 case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_ONE:
725 WARN() << "DIRTY_BIT_SAMPLE_ALPHA_TO_ONE unimplemented";
726 break;
727 case gl::State::DIRTY_BIT_COVERAGE_MODULATION:
728 WARN() << "DIRTY_BIT_COVERAGE_MODULATION unimplemented";
729 break;
730 case gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_MV:
731 WARN() << "DIRTY_BIT_PATH_RENDERING_MATRIX_MV unimplemented";
732 break;
733 case gl::State::DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ:
734 WARN() << "DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ unimplemented";
735 break;
736 case gl::State::DIRTY_BIT_PATH_RENDERING_STENCIL_STATE:
737 WARN() << "DIRTY_BIT_PATH_RENDERING_STENCIL_STATE unimplemented";
738 break;
739 case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
740 WARN() << "DIRTY_BIT_FRAMEBUFFER_SRGB unimplemented";
741 break;
Jamie Madillc67323a2017-11-02 23:11:41 -0400742 case gl::State::DIRTY_BIT_CURRENT_VALUES:
743 WARN() << "DIRTY_BIT_CURRENT_VALUES unimplemented";
744 break;
Jamie Madillebf72992017-10-13 14:09:45 -0400745 default:
Jamie Madillc67323a2017-11-02 23:11:41 -0400746 UNREACHABLE();
Jamie Madillebf72992017-10-13 14:09:45 -0400747 break;
748 }
749 }
Jamie Madill5547b382017-10-23 18:16:01 -0400750
751 if (dirtyTextures)
752 {
Jamie Madille1f3ad42017-10-28 23:00:42 -0400753 ProgramVk *programVk = vk::GetImpl(glState.getProgram());
Jamie Madill5547b382017-10-23 18:16:01 -0400754 programVk->invalidateTextures();
755 }
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400756}
757
758GLint ContextVk::getGPUDisjoint()
759{
760 UNIMPLEMENTED();
761 return GLint();
762}
763
764GLint64 ContextVk::getTimestamp()
765{
766 UNIMPLEMENTED();
767 return GLint64();
768}
769
Jamie Madill4928b7c2017-06-20 12:57:39 -0400770void ContextVk::onMakeCurrent(const gl::Context * /*context*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400771{
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400772}
773
774const gl::Caps &ContextVk::getNativeCaps() const
775{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400776 return mRenderer->getNativeCaps();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400777}
778
779const gl::TextureCapsMap &ContextVk::getNativeTextureCaps() const
780{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400781 return mRenderer->getNativeTextureCaps();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400782}
783
784const gl::Extensions &ContextVk::getNativeExtensions() const
785{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400786 return mRenderer->getNativeExtensions();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400787}
788
789const gl::Limitations &ContextVk::getNativeLimitations() const
790{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400791 return mRenderer->getNativeLimitations();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400792}
793
794CompilerImpl *ContextVk::createCompiler()
795{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400796 return new CompilerVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400797}
798
Jamie Madillacccc6c2016-05-03 17:22:10 -0400799ShaderImpl *ContextVk::createShader(const gl::ShaderState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400800{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400801 return new ShaderVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400802}
803
Jamie Madillacccc6c2016-05-03 17:22:10 -0400804ProgramImpl *ContextVk::createProgram(const gl::ProgramState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400805{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400806 return new ProgramVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400807}
808
Jamie Madillacccc6c2016-05-03 17:22:10 -0400809FramebufferImpl *ContextVk::createFramebuffer(const gl::FramebufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400810{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500811 return FramebufferVk::CreateUserFBO(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400812}
813
814TextureImpl *ContextVk::createTexture(const gl::TextureState &state)
815{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400816 return new TextureVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400817}
818
819RenderbufferImpl *ContextVk::createRenderbuffer()
820{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400821 return new RenderbufferVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400822}
823
Jamie Madill8f775602016-11-03 16:45:34 -0400824BufferImpl *ContextVk::createBuffer(const gl::BufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400825{
Jamie Madill8f775602016-11-03 16:45:34 -0400826 return new BufferVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400827}
828
Jamie Madillacccc6c2016-05-03 17:22:10 -0400829VertexArrayImpl *ContextVk::createVertexArray(const gl::VertexArrayState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400830{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400831 return new VertexArrayVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400832}
833
834QueryImpl *ContextVk::createQuery(GLenum type)
835{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400836 return new QueryVk(type);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400837}
838
839FenceNVImpl *ContextVk::createFenceNV()
840{
Jamie Madillacccc6c2016-05-03 17:22:10 -0400841 return new FenceNVVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400842}
843
Jamie Madill70b5bb02017-08-28 13:32:37 -0400844SyncImpl *ContextVk::createSync()
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400845{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400846 return new SyncVk();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400847}
848
Geoff Lang73bd2182016-07-15 13:01:24 -0400849TransformFeedbackImpl *ContextVk::createTransformFeedback(const gl::TransformFeedbackState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400850{
Geoff Lang73bd2182016-07-15 13:01:24 -0400851 return new TransformFeedbackVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400852}
853
Jamie Madill06ef36b2017-09-09 23:32:46 -0400854SamplerImpl *ContextVk::createSampler(const gl::SamplerState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400855{
Jamie Madill06ef36b2017-09-09 23:32:46 -0400856 return new SamplerVk(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400857}
858
Yunchao Hea336b902017-08-02 16:05:21 +0800859ProgramPipelineImpl *ContextVk::createProgramPipeline(const gl::ProgramPipelineState &state)
860{
861 return new ProgramPipelineVk(state);
862}
863
Sami Väisänene45e53b2016-05-25 10:36:04 +0300864std::vector<PathImpl *> ContextVk::createPaths(GLsizei)
865{
866 return std::vector<PathImpl *>();
867}
868
Jamie Madill72106562017-03-24 14:18:50 -0400869// TODO(jmadill): Use pipeline cache.
870void ContextVk::invalidateCurrentPipeline()
871{
Jamie Madille88ec8e2017-10-31 17:18:14 -0400872 mRenderer->releaseResource(*this, &mCurrentPipeline);
Jamie Madill72106562017-03-24 14:18:50 -0400873}
874
Jamie Madillfe548342017-06-19 11:13:24 -0400875gl::Error ContextVk::dispatchCompute(const gl::Context *context,
876 GLuint numGroupsX,
877 GLuint numGroupsY,
878 GLuint numGroupsZ)
Xinghua Cao2b396592017-03-29 15:36:04 +0800879{
880 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500881 return gl::InternalError();
Xinghua Cao2b396592017-03-29 15:36:04 +0800882}
883
Jamie Madill76e471e2017-10-21 09:56:01 -0400884vk::DescriptorPool *ContextVk::getDescriptorPool()
885{
886 return &mDescriptorPool;
887}
888
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400889} // namespace rx